https://www.acmicpc.net/problem/2644
2644๋ฒ: ์ด์๊ณ์ฐ
์ฌ๋๋ค์ 1, 2, 3, …, n (1 ≤ n ≤ 100)์ ์ฐ์๋ ๋ฒํธ๋ก ๊ฐ๊ฐ ํ์๋๋ค. ์ ๋ ฅ ํ์ผ์ ์ฒซ์งธ ์ค์๋ ์ ์ฒด ์ฌ๋์ ์ n์ด ์ฃผ์ด์ง๊ณ , ๋์งธ ์ค์๋ ์ด์๋ฅผ ๊ณ์ฐํด์ผ ํ๋ ์๋ก ๋ค๋ฅธ ๋ ์ฌ๋์ ๋ฒํธ๊ฐ ์ฃผ์ด
www.acmicpc.net
1. ๋ฌธ์ ์์ฝ
์ฐจ๋ก๋๋ก ์ด ๋ ธ๋ ๊ฐ์ n๊ณผ a, b๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ๊ฐ์ ๊ฐ์ m, ๊ฐ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
a์์ b๋ก ๊ฐ๋ ๊ฐ์ ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
2. ํ์ด
์๋ฐฉํฅ bfs, dfs๋ก ํ ์ ์๋ค.
์ฒ์์๋ ๋ถ๋ชจ๊ฐ ์กด์ฌํ๊ณ ๋ถ๋ชจ๋ฅผ ํ๊ณ ๊ฐ๋ค๋ณด๋ฉด ๋ฃจํธ๊ฐ ์กด์ฌํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ฌ ๋จ๋ฐฉํฅ ๊ทธ๋ํ๋ก ์ ๊ทผํ์๋ค. ๋ํ ๋ถ๋ชจ๋ฅผ ํ๊ณ ๊ฐ์ผํ๋ฏ๋ก dfs๊ฐ ์ ์ ํ๋ค๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง ๋ฐฉํฅ์ ์ ๊ฒฝ์ธ ํ์๊ฐ ์์๋๊ฒ, ์ ๋ ฅ์ ๋ฐ์ ๋๋ถํฐ ์ด๋ฏธ ๋ถ๋ชจ์ ์์๊ฐ์ ๊ด๊ณ๋ ํ์คํ๋ค.
์ฐ๋ฆฌ๊ฐ ํด์ผํ ์ผ์ a์์ b๊น์ง ๊ฐ๋ ๊ฐ์ ์ ๊ฐ์์ด๋ฏ๋ก, a์์ b๋ฅผ ์ฐพ์ผ๋ฌ ๊ฐ ๋๋ ๊ตณ์ด ๋จ๋ฐฉํฅ์ผ๋ก ์ฐพ์ผ๋ฌ๊ฐ ํ์๊ฐ ์๋ค. ์ฆ, a๊ฐ ๋ถ๋ชจ๋ b๊ฐ ๋ถ๋ชจ๋ a์์ b๊น์ง ๊ฐ๊ธฐ๋งํ๋ฉด ๋๋ค๋ ์๋ฏธ์ด๋ค. ๋๊ตฐ๋ค๋ ๊ฐ์ค์น๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋์ฑ ๋ฐฉํฅ์ ์ ๊ฒฝ์จ์ค ํ์๊ฐ ์๋ค.
dfs, bfs ๋ ๊ฐ์ง๋ก ํ์๋ค.
dfs๋ ๊ธฐ์ ์กฐ๊ฑด์ผ๋ก b์ ๋์ฐฉํ๋ฉด min์ ๊ฐฑ์ ํ๊ณ return ํด์ฃผ์๋ค.
bfs๋ ํ์ ์ธ์ ๋ ธ๋๋ฅผ ๋ฃ์ด์ค ๋ ๊น์ด๊น์ง ๊ฐ์ด ๋ฃ์ด์คฌ๋ค. ์ฌ๊ธฐ์ ๊น์ด๋ ์ด์ ๋ ธ๋ ๊น์ด+1์ ๋ฃ์ด์ฃผ์๋ค.
[์คํ๊ฒฐ๊ณผ]
dfs
bfs
ํ์คํ dfs๋ณด๋ค bfs๊ฐ ๋น ๋ฅด๋ค.
3. ์ฝ๋
1) dfs
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static List<List<Integer>> parent = new ArrayList<> ();
static int V, E, ans, r1, r2;
static int p1, p2, min;
static boolean[] visited;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
V = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
p1 = Integer.parseInt(st.nextToken());
p2 = Integer.parseInt(st.nextToken());
E = Integer.parseInt(br.readLine());
visited = new boolean[V+1];
for (int i = 0; i <= V; i++) {
parent.add(new ArrayList<> ());
}
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
parent.get(a).add(b);
parent.get(b).add(a);
} //์
๋ ฅ ๋
min = Integer.MAX_VALUE;
dfs(p1, 0);
if (min == Integer.MAX_VALUE) System.out.println(-1);
else System.out.println(min);
}
static void dfs(int node, int cnt) {
if (node == p2) { //๋์ฐฉ
min = Math.min(min, cnt);
//System.out.println(min);
return;
}
visited[node] = true;
int len = parent.get(node).size();
for (int i = 0; i < len; i++) {
int n = parent.get(node).get(i);
if(visited[n]) continue;
//System.out.println(n+" cnt: "+(cnt+1));
dfs(n, cnt+1);
visited[node] = false;
}
}
}
2) bfs
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int n, m, from, to, cnt;
static boolean[] visited;
static List<List<Integer>> family = new ArrayList<>();
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
from = Integer.parseInt(st.nextToken());
to = Integer.parseInt(st.nextToken());
m = Integer.parseInt(br.readLine());
//์ด๊ธฐํ
visited = new boolean[n+1];
for (int i = 0; i <= n; i++) {
family.add(new ArrayList<> ());
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int mem1 = Integer.parseInt(st.nextToken());
int mem2 = Integer.parseInt(st.nextToken());
family.get(mem1).add(mem2);
family.get(mem2).add(mem1); //์๋ฐฉํฅ
}
bfs();
}
static void bfs() {
Queue<Node> queue = new ArrayDeque<> ();
visited[from] = true;
queue.offer(new Node(from, 0));
while (!queue.isEmpty()) {
Node front = queue.poll();
int len = family.get(front.pos).size();
for (int i = 0; i < len; i++) {
int idx = family.get(front.pos).get(i);
if (visited[idx]) continue;
if (idx == to) {
System.out.println(front.d+1);
return;
}
visited[idx] = true;
queue.offer(new Node(idx, front.d+1)); //ํ์ ๋ฃ์ด์ค ๋ ๊น์ด๋ฅผ ๊ฐ์ด ๋ฃ์ด์ค
}
}
System.out.println(-1);
}
static class Node {
int pos, d;
public Node(int pos, int d) {
this.pos = pos;
this.d = d;
}
}
}
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 15683 ๊ฐ์ (Java) (0) | 2022.09.15 |
---|---|
[BOJ] 2638 ์น์ฆ (Java) (0) | 2022.09.11 |
[BOJ] 2193 ์ด์น์ (Java) (0) | 2022.09.06 |
[BOJ] 15686 ์นํจ๋ฐฐ๋ฌ [Java] (0) | 2022.08.29 |
[BOJ] 16637 ๊ดํธ์ถ๊ฐํ๊ธฐ [Java] (0) | 2022.08.28 |