알고리즘/BOJ

[BOJ] 1766. 문제집

재담 2022. 3. 6. 00:44

문제 원본 : https://www.acmicpc.net/problem/1766

 

1766번: 문제집

첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐 두 정수의 순서쌍 A,B가 빈칸을 사이에 두고 주

www.acmicpc.net

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringBuilder builder = new StringBuilder();

        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        ArrayList<Integer>[] adj = new ArrayList[n + 1];
        int[] c = new int[n + 1];

        for (int i = 1; i <= n; ++i) {
            adj[i] = new ArrayList<>();
        }

        for (int i = 0; i < m; ++i) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            adj[a].add(b);
            ++c[b];
        }

        for (int i = 1; i <= n; ++i) {
            Collections.sort(adj[i]);
        }

        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
        for (int i = 1; i <= n; ++i) {
            if (c[i] == 0) {
                priorityQueue.add(i);
            }
        }

        while (!priorityQueue.isEmpty()) {
            int curr = priorityQueue.poll();
            builder.append(curr).append(" ");

            for (int next : adj[curr]) {
                --c[next];

                if (c[next] == 0) {
                    priorityQueue.add(next);
                }
            }
        }

        bw.write(builder.toString());

        bw.close();
        br.close();
    }
}
  • 위상 정렬 문제
  • 일반 위상 정렬 문제에서 큐를 우선순위 큐로만 바꿔주면 해결된다.