[적용한 알고리즘]
위상정렬, 힙
[아이디어]
위상정렬 말고도 가장 작은 애를 큐에 담아야한다.
-> 우선순위 큐
[생각의 흐름 / 절차]
지켜야할 규칙이
1. 위상정렬을 하여라
2. 가능한 가장 작은 애부터 뽑아라
1. 은 위상정렬을 통해 구현하면 된다.
2. 는 우선순위 큐(minHeap) 을 이용하면 되겠다.
[교훈]
우선 순위 큐는 너무 강력한거 같다.
<코드>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int MAX_N = 32001;
int main(){
int N, M;
int indegree[MAX_N] = { 0 };
vector<int> adj[MAX_N];
scanf("%d %d", &N, &M);
for (int i = 0; i < M; i++){
int from, to;
scanf("%d %d", &from, &to);
indegree[to]++;
adj[from].push_back(to);
}
int result[MAX_N] = { 0 };
priority_queue<int, vector<int>, greater<int>> Q;
for (int i = 1; i <= N; i++){
if (indegree[i] == 0){
Q.push(i);
}
}
for (int i = 1; i <= N; i++){
int cur = Q.top();
Q.pop();
result[i] = cur;
for (int nxt : adj[cur]){
if (--indegree[nxt] == 0){
Q.push(nxt);
}
}
}
for (int i = 1; i <= N; i++){
printf("%d ", result[i]);
}
return 0;
}