Skills/Algorithm

[백준] 24445번: 알고리즘 수업 - 너비 우선 탐색 2 (JAVA)

개발자 윤구나 2023. 8. 11. 14:59
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
	static int order;
	static int[] check;

	public static void main(String[] args) throws Exception {
		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 R = Integer.parseInt(st.nextToken());
		
		for (int n = 0; n < N; n++) {
			graph.add(new ArrayList<Integer>());
		}
		
		for (int m = 0; m < M; m++) {
			st = new StringTokenizer(br.readLine());
			int u = Integer.parseInt(st.nextToken());
			int v = Integer.parseInt(st.nextToken());
			graph.get(u - 1).add(v - 1); 
			graph.get(v - 1).add(u - 1);		
		}
		
		for (ArrayList<Integer> g : graph) {
			Collections.sort(g, Comparator.reverseOrder());
		}
		
		// System.out.println(graph);
		
		check = new int[N];
		order = 1;
		
		// BFS
		Queue<Integer> q = new ArrayDeque<>();
		int start = R - 1;
		q.add(start); // 루트 노드(시작점)
		check[start] = order; // 방문한 시작점에 1번째 방문을 기록
		while (!q.isEmpty()) { // queue가 빌 때까지 반복한다.
			int currentNode = q.poll();
			// System.out.println("현재 노드: " + currentNode);
			// 가장 오래된 노드를 queue에서 꺼낸다.
			ArrayList<Integer> edges = graph.get(currentNode);
			// 그래프에서 조회한 뒤, 그 노드와 연결된 다음 노드들
			for (int nextNode: edges) {
				if (check[nextNode] != 0) {
					continue;
				}
				// System.out.println("다음 노드: " + nextNode);
				check[nextNode] = ++order;
				q.add(nextNode);
			}
			
		}
		
		for (int c: check) {
			System.out.println(c);
		}
	}

}