알고리즘/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();
}
}
- 위상 정렬 문제
- 일반 위상 정렬 문제에서 큐를 우선순위 큐로만 바꿔주면 해결된다.