개발/알고리즘
백준 2644번 촌수계산
dev-yoon-jerry
2021. 6. 8. 00:52
https://www.acmicpc.net/problem/2644
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1≤n≤100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진
www.acmicpc.net
전형적인 dfs연습문제였다. 문제들을 bfs로 많이 풀다보니 자연스럽게 bfs로 풀려고 하는 것 같은데, 이처럼 단순한 문제는 dfs로 풀어보려는 노력을 해야겠다.
그래도 dfs 까먹거나 그런건 아니니 다행!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class bj2644 {
static int N;
static int A,B;
static boolean [][] edge;
static boolean [] visit;
static int result=987654321;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
int input = Integer.parseInt(br.readLine());
edge = new boolean[N+1][N+1];
visit = new boolean[N+1];
for(int i=0;i<input;i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
edge[a][b]=true;
edge[b][a]=true;
}
dfs(A,0);
if(result==987654321)
System.out.println(-1);
else
System.out.println(result);
}
static void dfs(int nowIndex,int level){
visit[nowIndex] = true;
if(nowIndex == B) {
result = Math.min(result, level);
return;
}
for(int i=1;i<N+1;i++) {
if(visit[i]) continue;
if(!edge[nowIndex][i]) continue;
dfs(i,level+1);
}
}
}