๐ ๋ฌธ์
https://www.acmicpc.net/problem/2644
๋ฌธ์
์ฐ๋ฆฌ ๋๋ผ๋ ๊ฐ์กฑ ํน์ ์น์ฒ๋ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์ด์๋ผ๋ ๋จ์๋ก ํํํ๋ ๋ ํนํ ๋ฌธํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด๋ฌํ ์ด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ณ์ฐ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ชจ์ ์์ ์ฌ์ด๋ฅผ 1์ด์ผ๋ก ์ ์ํ๊ณ ์ด๋ก๋ถํฐ ์ฌ๋๋ค ๊ฐ์ ์ด์๋ฅผ ๊ณ์ฐํ๋ค. ์๋ฅผ ๋ค๋ฉด ๋์ ์๋ฒ์ง, ์๋ฒ์ง์ ํ ์๋ฒ์ง๋ ๊ฐ๊ฐ 1์ด์ผ๋ก ๋์ ํ ์๋ฒ์ง๋ 2์ด์ด ๋๊ณ , ์๋ฒ์ง ํ์ ๋ค๊ณผ ํ ์๋ฒ์ง๋ 1์ด, ๋์ ์๋ฒ์ง ํ์ ๋ค๊ณผ๋ 3์ด์ด ๋๋ค.
์ฌ๋ฌ ์ฌ๋๋ค์ ๋ํ ๋ถ๋ชจ ์์๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ์ฃผ์ด์ก์ ๋, ์ฃผ์ด์ง ๋ ์ฌ๋์ ์ด์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฌ๋๋ค์ 1, 2, 3, …, n (1 ≤ n ≤ 100)์ ์ฐ์๋ ๋ฒํธ๋ก ๊ฐ๊ฐ ํ์๋๋ค. ์ ๋ ฅ ํ์ผ์ ์ฒซ์งธ ์ค์๋ ์ ์ฒด ์ฌ๋์ ์ n์ด ์ฃผ์ด์ง๊ณ , ๋์งธ ์ค์๋ ์ด์๋ฅผ ๊ณ์ฐํด์ผ ํ๋ ์๋ก ๋ค๋ฅธ ๋ ์ฌ๋์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์งธ ์ค์๋ ๋ถ๋ชจ ์์๋ค ๊ฐ์ ๊ด๊ณ์ ๊ฐ์ m์ด ์ฃผ์ด์ง๋ค. ๋ท์งธ ์ค๋ถํฐ๋ ๋ถ๋ชจ ์์๊ฐ์ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๋ ๋ฒํธ x,y๊ฐ ๊ฐ ์ค์ ๋์จ๋ค. ์ด๋ ์์ ๋์ค๋ ๋ฒํธ x๋ ๋ค์ ๋์ค๋ ์ ์ y์ ๋ถ๋ชจ ๋ฒํธ๋ฅผ ๋ํ๋ธ๋ค.
๊ฐ ์ฌ๋์ ๋ถ๋ชจ๋ ์ต๋ ํ ๋ช ๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ ๋ ฅ์์ ์๊ตฌํ ๋ ์ฌ๋์ ์ด์๋ฅผ ๋ํ๋ด๋ ์ ์๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ ์ฌ๋์ ์น์ฒ ๊ด๊ณ๊ฐ ์ ํ ์์ด ์ด์๋ฅผ ๊ณ์ฐํ ์ ์์ ๋๊ฐ ์๋ค. ์ด๋์๋ -1์ ์ถ๋ ฅํด์ผ ํ๋ค.
โ๏ธ ํ์ด
โป๏ธ ์ธ์ ๋ฆฌ์คํธ๊ฐ ์๋ ์ธ์ ํ๋ ฌ๋ก ํผ ๋ฌธ์ ์ด๋ค.
โป๏ธ boolean[N+1][N+1] map: i๋ฒ ์ฌ๋๊ณผ j๋ฒ ์ฌ๋์ ์ฐ๊ฒฐ์ ๋ฌด๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด.
โป๏ธ ๊ด๊ณ๋ฅผ ์ฐพ์์ผ ํ๋ ๋ ์ฌ๋ ์ค ํ ๋ช ์ผ๋ก๋ถํฐ DFS ํ์์ ์์ํ์ฌ ๋ช ๊ฐ์ ๋ ธ๋๋ฅผ ์ง๋๊ฐ๋์ง ๊ฐ์๋ฅผ ์นด์ดํ ํ๋ค. ํ์ ์ค ๋ค๋ฅธ ํ ์ฌ๋๊น์ง ๋๋ฌํ๋ฉด ์นด์ดํ ํ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ ํ์์ ๋ฉ์ถ๋ค.
โป๏ธ ์๋ฅผ ๋ค์ด ๋>๋ถ๋ชจ>ํ์ ์์ผ๋ก ์ฐพ์๊ฐ ๋, ํ์ ์์ ์ด์๋ ๋ถ๋ชจ>ํ์ ์ ๋จ๊ณ๋ฅผ ํฉ์ณ 2๊ฐ ๋๋ ๊ฒ์ด๋ค.
โป๏ธ ๋ชจ๋ ์ฐ๊ฒฐ ๋ ธ๋๋ฅผ ํ์ํด๋ ๋ชฉํ์ธ ์ฌ๋์ ์ฐพ์ง ๋ชปํ๋ค๋ฉด ์ด์๊ด๊ณ๊ฐ ์๋ค๋ ๋ป์ด๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ์ ์ด๊ธฐํ๊ฐ์ธ -1์ด ์ถ๋ ฅ๋๋ค.
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
//DFS
public class Main_๋ฐฑ์ค_2644_์ด์๊ณ์ฐ_์ค๋ฒ2 {
static int N, from, to, result=-1;
static boolean[][] map;
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
N = Integer.parseInt(br.readLine()); // ์ฌ๋์ ์
st = new StringTokenizer(br.readLine());
from = Integer.parseInt(st.nextToken());
to = Integer.parseInt(st.nextToken());
map = new boolean[N+1][N+1];
int M = Integer.parseInt(br.readLine());
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());//๋ถ๋ชจ
int v2 = Integer.parseInt(st.nextToken());//์์
map[v1][v2]=map[v2][v1]=true;
}//input
visited = new boolean[N+1];
dfs(from, 0);
System.out.println(result);
}//end of main
private static void dfs(int p, int d) {
//๋ฐฉ๋ฌธ์ฒ๋ฆฌ
visited[p] = true;
//๋ชฉํ
if(p==to) {
result=d;
return;
}
for (int i = 1; i <= N; i++) {
if(map[p][i] && !visited[i]) dfs(i, d+1);
}
}//end of dfs
}//end of class
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ