본문 바로가기
알고리즘/그래프

[java 백준] 실버 2/ 1260번 DFS와BFS

by Meaning_ 2021. 9. 22.
728x90
반응형

https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
 
public class Main {
    static int node[][];// 인접행렬
    static int check[];// 노드의 방문표시
    static Queue<Integer> queue = new LinkedList<>();
 
    public static void dfs(int start) {
        if (check[start] == 1) {
            return;
        } else {
            check[start] = 1;// sean 채워주기
 
        }
        System.out.print(start + " ");
        for (int i = 1; i < node.length; i++) {
            if (node[start][i] == 1) {
                dfs(i);
 
            }
 
        }
 
    }
 
    public static void bfs(int start) {
        queue.offer(start);
        check[start] = 1;
        while (!queue.isEmpty()) {
            int x = queue.remove();
            System.out.print(x + " ");
            for (int i = 1; i < node.length; i++) {
                if (check[i] != 1 && node[x][i] == 1) {
                    queue.offer(i);
                    check[i] = 1;
                }
            }
        }
 
    }
 
    public static void main(String[] args) throws NumberFormatException, IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();// 정점의 개수
        int m = sc.nextInt();// 간선의 개수
        int start = sc.nextInt();// 탐색 시작
        node = new int[n + 1][n + 1];
        check = new int[n + 1];
        for (int i = 0; i < m; i++) { // 인접행렬
 
            int a = sc.nextInt();
            int b = sc.nextInt();
            node[a][b] = 1;
            node[b][a] = 1;
        }
        dfs(start);
        Arrays.fill(check, 0);
        System.out.println("");
        bfs(start);
 
    }
 
}
cs

 

그래프 구현이 처음이라 재귀로 구현한 DFS같은 경우는 도저히 감이 안와서(사실 BFS도...) 다른 사람의 코드를 참고했다.

우선 dfs의 경우 열은 행과 인접한 것이 채택(?)된다 생각하면 된다.

이게 무슨 말이냐면 

 

첫번째로 x에는 1이 들어가고 arr[1][2]가 가장 먼저 1이 되어있다. 그러면 열인 2가 다음번 행으로 채택된다!

근데 check[2][1]의 경우 dfs(1)을 했을 때 어차피 check[1]=1이므로 리턴된다.

그러면 check[2][4]가 유일한 1이므로 열인 4가 행으로 들어간다.

 4행을 보면 이미 1,2는 그 값이 1이므로, 열이 3인게 다음 행으로 들어가면서

 

순서가 1 2 4 3이 되는 것이다!

 

 

 

728x90
반응형

댓글