개발/알고리즘

백준 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);
		}
	}
}

'개발 > 알고리즘' 카테고리의 다른 글

백준 1062번 가르침  (0) 2021.06.17
백준 9465번 스티커  (0) 2021.06.10
백준 1149번 RGB거리  (0) 2021.06.09
백준 11725번 트리의 부모 찾기  (0) 2021.06.08
백준 21608번 상어초등학교  (0) 2021.06.07