Algorithm/BFS DFS
[백준 2644] 촌수계산
09009
2023. 12. 22. 02:55
문제 보기
https://www.acmicpc.net/problem/2644
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어
www.acmicpc.net
문제 해결
2차원 배열을 생성하여 서로 연결되어 있으면 1로 설정한다.
두 사람의 촌수를 계산하는 visited라는 1차원 배열을 생성하여 문제를 해결함.
소스 코드
//https://www.acmicpc.net/problem/2644
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int n, m;
static int[][] arr;
static int[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 전체 사람의 수
n = Integer.parseInt(br.readLine());
// 배열
arr = new int[n+1][n+1];
// 방문
visited = new int[n+1];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// 촌수 계산 번호
int node1 = Integer.parseInt(st.nextToken());
int node2 = Integer.parseInt(st.nextToken());
// 부모 자식들 간의 관계의 개수
int m = Integer.parseInt(br.readLine());
for (int i=0; i<m; i++) {
st = new StringTokenizer(br.readLine(), " ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
arr[x][y] = arr[y][x] = 1;
}
System.out.println(bfs(node1, node2));
}
public static int bfs(int node1, int node2) {
Queue<Integer> q = new LinkedList<>();
q.add(node1);
while (!q.isEmpty()) {
int curNode = q.poll();
if (curNode == node2)
return visited[curNode];
for (int i=1; i<n+1; i++) {
if (arr[curNode][i] == 1 && visited[i] == 0 && i != node1) {
visited[i] = visited[curNode] + 1;
q.add(i);
}
}
}
return -1;
}
}