[๋ฐฑ์ค] 1260๋ฒ : DFS์ BFS
1260๋ฒ: DFS์ BFS
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N(1 ≤ N ≤ 1,000), ๊ฐ์ ์ ๊ฐ์ M(1 ≤ M ≤ 10,000), ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ V๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ค ๋ ์ ์ ์ฌ
www.acmicpc.net
๋ฌธ์
์์
ํ์ด
๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ธ DFS(๊น์ด ์ฐ์ ํ์)๊ณผ BFS(๋์ด ์ฐ์ ํ์)์ ํ์ฉํ ๋ํ์ ์ธ ๋ฌธ์ ์ด๋ค.
DFS (๊น์ด ์ฐ์ ํ์)
DFS๋ ์ฝ๊ฒ ๋งํ๋ฉด ํ ์ฐ์ธ๋ง ํ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ DFS๋ ์ฌ๊ท์ ์คํ(stack)์ ํตํด์ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค.
๋ฌธ์ ์ ์ฒซ๋ฒ์งธ ์์ ๋ฅผ ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
4๊ฐ์ ์ ์ ( 1, 2, 3, 4 )์ด ์๊ณ 5๊ฐ์ ๊ฐ์ ์ด ์์ผ๋ฉฐ ์ ์ 1๋ถํฐ ํ์ธ์ ์์ํ๋ค๋ ์๋ฏธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ์ ๊ฐ์ด ๊ฐ์ ์ด ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ๊ฐ์ ์ ํ๋ฉด,
์ ์ 1๊ณผ ์ฐ๊ฒฐ๋์ด ์๋ ์ ์ ์ 2, 3, 4์ด๋ค.
๊ทธ๋ผ 1๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด 2๋ฅผ ๋ ๊น์ด ํ์์ ๋ค์ด๊ฐ๋ค.
์ ์ 2์ ์ฐ๊ฒฐ๋์ด ์๋ ์ ์ ์ 1, 4 ์ด๋ค.
์ ์ 1์ ์ด๋ฏธ ํ์ธํ์ผ๋ฏ๋ก 4๋ฅผ ๊น์ด ํ์ํ๋ค.
4์ ์ฐ๊ฒฐ๋ ์ ์ ์ 1, 2, 3์ด๋ค.
์ ์ 1๊ณผ 2๋ ์ด๋ฏธ ํ์ธ ํ์์ผ๋ก ๋์ด ๋๋ค.
์ด๋ ๊ฒ ํ์ธํ ์์๋ 1, 2, 4, 3์ด ๋๋ค.
BFS (๋์ด ์ฐ์ ํ์)
BFS๋ ํ ๊น์ด์ฉ ์ฐจ๋ก๋ก ํ์ธํ๋ฉฐ ๋ด๋ ค๊ฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
BFS๋ Queue์ LinkedList๋ฅผ ํตํด์ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ฒ์๋ ๋ฌธ์ ์ ์ฒซ๋ฒ์งธ ์์ ๋ฅผ ํตํด ํ์ธํด ๋ณด์.
1๋ฒ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ์ 2, 3, 4๋ฒ์ด๋ค.
๊ทธ๋ผ 2, 3, 4์ ๊ฐ์ Queue์ ๋ฃ์ด์ ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ ๋จ๊น๊ณผ ๋์์ ๋ฐฉ๋ฌธํ ๊ฐ์ ์ถ๋ ฅํ๋ค.
ํ์ ๋ด๊ธด ๊ฐ๋ค์ ์์ฐจ์ ์ผ๋ก poll() ํ๋ฉด์ ํ ์๋ฃ๋ฅผ ์ญ์ ํ๋ฉด์ ๋ค์ ๊ฐ์ผ๋ก ์ด๋ํ๋ค.
์ด๋ ๊ฒ ๋์ผ ๊น์ด์ ๊ฐ๋ค์ ์ํํ๋ฉด์ ๋ง์ง๋ง ๊ฐ๊น์ง ๋ค๋ค๋ฅด๊ฒ ๋๋ค.
๊ทธ๋ ๊ฒ 1, 2, 3, 4์ ์์๋๋ก ์ ์ ์ ํ์ธํ๊ฒ ๋๋ค.
์์ค ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
// ํจ์์์ ์ฌ์ฉํ๋ ๋ณ์
static int[][] check; // ๊ฐ์ ์ฐ๊ฒฐ์ํ
static boolean[] visit; // ํ์ธ ์ฌ๋ถ
static int N; // ์ ์ ๊ฐ์
static int M; // ๊ฐ์ ๊ฐ์
static int V; // ์์ ์ ์
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
V = Integer.parseInt(st.nextToken());
check = new int[1001][1001]; // ์ขํ๋ฅผ ๊ทธ๋๋ก ๋ฐ์๋ค์ด๊ธฐ ์ํด +1ํด์ ์ ์ธ
visit = new boolean[1001]; // ์ด๊ธฐ๊ฐ์ false๋ค.
// ๊ฐ์ ์ฐ๊ฒฐ์ํ ์ ์ฅ
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
check[x][y] = check[y][x] = 1;
}
DFS(V); // DFS ํธ์ถ
visit = new boolean[1001]; // ํ์ธ์ํ ์ด๊ธฐํ
System.out.println(); // ์ค๋ฐ๊ฟ
BFS(); // BFS ํธ์ถ
}
public static void DFS(int i) {
visit[i] = true;
System.out.print(i + " ");
for (int j = 1; j <= N; j++) {
if (check[i][j] == 1 && visit[j] == false) {
DFS(j);
}
}
}
public static void BFS() {
Queue<Integer> q = new LinkedList<Integer>();
q.offer(V); // ์์์ ๋ Queue์ ์ ์ฅ
visit[V] = true;
System.out.print(V + " ");
// Queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต. ๋ฐฉ๋ฌธ ์ ์ ์ ํ์ธ, ์ถ๋ ฅ ํ Queue์ ๋ฃ์ด ์์๋๋ก ํ์ธ
while (!q.isEmpty()) {
int tmp = q.poll();
for (int j = 1; j <= N; j++) {
if (check[tmp][j] == 1 && visit[j] == false) {
q.offer(j);
visit[j] = true;
System.out.print(j + " ");
}
}
}
}
}
์ฐธ๊ณ
๊น์ด ์ฐ์ ํ์ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . ๊น์ด ์ฐ์ ํ์์ ์ ๋๋ฉ์ด์ ์์ ๊น์ด ์ฐ์ ํ์( - ๅชๅ ๆข็ดข, ์์ด: depth-first search, DFS)์ ๋งน๋ชฉ์ ํ์๋ฐฉ๋ฒ์ ํ๋๋ก ํ์ํธ๋ฆฌ์ ์ต๊ทผ์ ์ฒจ๊ฐ๋ ๋ ธ๋๋ฅผ ์ ํ
ko.wikipedia.org
๋๋น ์ฐ์ ํ์ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ .
ko.wikipedia.org