๐Ÿ“š ์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1260๋ฒˆ : DFS์™€ BFS

Kyle99 2023. 1. 4. 16:19

 

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