유향 그래프의 꼭짓점들(vertex)을 변의 방향을 거스르지 않도록 나열하는 기법
(순서가 있는 작업들에 순서에 맞게 배치해주는 기법)
예시) 하루 일과 작업 순서 정하기
가능한 일의 순서
1 -> 2 -> 3 -> 5 -> 4 -> 6 -> 7
1 -> 2 -> 5 -> 4 -> 3 -> 6 -> 7
…
1 -> 5 -> 2 -> 6 -> 7 -> 4 -> 3
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int n, m;
int degree[32010];
vector<int> G[32010];
void topologySort() {
queue<int> q;
for(int i=1; i<=n; i++)
if(!degree[i])
q.push(i);
while (!q.empty()) {
int cur = q.front();
cout << cur << ' ';
q.pop();
for(int nxt : G[cur]) {
if(--degree[nxt] == 0) q.push(nxt);
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
for(int i=0; i<m; i++) {
int u,v; cin >> u >> v;
G[u].push_back(v);
degree[v]++;
}
topologySort();
}