위상정렬은 우선순위가 있는 일의 순서를 정하는 것이라고 할 수 있다.
따라서 사이클이 있는 그래프에서는 이를 찾을 수 없다. 사이클을 체크해서 가능한지 안한지 체크해야 한다.
vector<int> path;
void dfs(int here) {
visited[here] = true;
for(auto there:adj[here]) {
if(!visited[there])
dfs(there);
}
path.emplace_back(here);
}
void topologicalSort() {
for (int i=0; i<n; ++i) {
if(!visited[i])
dfs(i);
}
reverse(path.begin(), path.end());
}
int indegree[N];
void topologySort() {
for(int i=0; i<N; ++i) {
for(int j:adj[i]) {
indegree[j]++;
}
}
vector<int> path;
queue<int> q;
for(int i=0; i<N; ++i) {
if(!indegree[i]) {
q.push(i);
}
}
// indegree가 0이 되면 큐에 넣는다.
for(int here=0; here<N; ++here){
if(q.empty()) {
// 중간에 큐가 비면 위상정렬이 불가능하다는 것. 즉 사이클이 있다.
break;
}
int here = q.front();
q.pop();
path.emplace_back(here);
for(auto& there:adj[here]) {
indegree[there]--;
if(indegree[there] == 0) {
q.push(there);
}
}
}
}