Development Palette

b1268_DFS와BFS 본문

Algorithm/Baekjoon

b1268_DFS와BFS

징주 2021. 9. 16. 21:30

 

package com.hotfive.workbook.b1260_DFS와BFS;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
//https://www.acmicpc.net/problem/1260

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int N = Integer.parseInt(st.nextToken());   //정점개수
        int M = Integer.parseInt(st.nextToken());   //간선갯수
        int V = Integer.parseInt(st.nextToken());   //탐색을 시작할 정점의 번호

        //방문체크 배열
        boolean [] visited = new boolean[N+1];

        // 정점마다 연결해 줄 인접리스트 배열생성
        LinkedList<Integer>[] adjlist = new LinkedList[N+1];
        for (int n = 1; n <= N; n++) {
            adjlist[n] = new LinkedList<>(); // 해당 정점에 연결된 정점들이 담겨있는 리스트
        }

        // 정점 연결 // 무방향 간선 연결
        for (int m = 0; m < M; m++) {
            st = new StringTokenizer(br.readLine());
            int v1 = Integer.parseInt(st.nextToken());  // 연결할 정점 v1, v2
            int v2 = Integer.parseInt(st.nextToken());
            adjlist[v1].add(v2);
            adjlist[v2].add(v1);
        }

        // 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하기 위해 오름차순 정렬
        for (int n = 1; n <=N; n++) {
            Collections.sort(adjlist[n]);
        }

        // DFS, BFS 실행
        dfs(V, adjlist, visited);
        visited = new boolean[N+1];
        System.out.println();
        bfs(V, adjlist, visited);

        br.close();
    }

    private static void dfs(int v, LinkedList<Integer>[] adjlist, boolean[] visited) {
        visited[v] = true;
        System.out.print(v + " ");

        for (int n : adjlist[v]) {
            if (visited[n]) continue;
            dfs(n,adjlist,visited);
        }
    }

    public static void bfs(int v, LinkedList<Integer>[] adjList, boolean[] visited) {

        Queue<Integer> queue = new LinkedList<>();
        queue.add(v);
        visited[v]= true;

        while (!queue.isEmpty()){
            v = queue.poll();
            System.out.print(v + " ");

            for (int n : adjList[v]) {
                if(visited[n]) continue;
                visited[n] = true;
                queue.add(n);
            }
        }
    }
}
/*
4 5 1
1 2
1 3
1 4
2 4
3 4
 */
 

1260번: DFS와 BFS

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

www.acmicpc.net

'Algorithm > Baekjoon' 카테고리의 다른 글

b1012_유기농배추  (0) 2021.09.18
b2178_미로탐색  (0) 2021.09.18
b2636_치즈  (0) 2021.09.15
b9461_파도반수열  (0) 2021.09.15
b1463_1로만들기  (0) 2021.09.15
Comments