백준 (with JAVA)/그 외

1260번: DFS & BFS (실버 2)

백_곰 2023. 5. 5. 11:24

1260번: DFS와 BFS (acmicpc.net)

 

1260번: DFS와 BFS

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

www.acmicpc.net

1. 문제 설명

 

 

 

 

2. 입출력 조건 및 예제

입력 조건

(1) 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 

(2) 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다.

(3) 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있으며, 입력으로 주어지는 간선은 양방향이다.

 

출력 조건

(1) 첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. 

( V부터 방문된 점을 순서대로 출력하면 된다. )

 

입출력 예제

 

 

 

3. 풀이 및 코드

: 두 문제에 대한 풀이는 이미 아래의 링크에서 설명하였기 때문에 여기서는 생략하겠다.

DFS (Depth First Search) (tistory.com)

BFS (Breadth First Search) (tistory.com)

 

( 단, DFS, BFS 모두 인접 행렬로 풀었다. )

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main {
    static int N, M, V;
    static int[][] graph = new int[1001][1001];
    static boolean[] visited = new boolean[1001];
    static Queue<Integer> q = new LinkedList<>();
    
    static BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder sb = new StringBuilder();
    
    public static void main(String[] args) throws Exception {
        StringTokenizer st = new StringTokenizer(sc.readLine());
        
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        V = Integer.parseInt(st.nextToken());
        
        for(int i=1; i<=M; i++) {
            st = new StringTokenizer(sc.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            
            // 양방향이므로
            graph[a][b] = 1;
            graph[b][a] = 1;
        }
        dfs(V);
        sb.append("\n");
        visited = new boolean[1001];
        
        bfs(V);
        System.out.println(sb);
    }
    
    static void dfs(int nodeIndex) {
        visited[nodeIndex] = true;
        
        sb.append(nodeIndex + " ");
        
        for(int i=1; i<=N; i++) {
            if(graph[nodeIndex][i] == 1 && !visited[i]) {
                dfs(i);
            }
        }
    }
    
    static void bfs(int nodeIndex) {
        q.add(nodeIndex);
        visited[nodeIndex] = true;
        
        while(!q.isEmpty()) {
            nodeIndex = q.poll();
            sb.append(nodeIndex + " ");
            
            for(int i=1; i<=N; i++) {
                if(graph[nodeIndex][i] == 1 && !visited[i]) {
                    q.add(i);
                    visited[i] = true;
                }
            }
        }
    }
}
cs