题解 | #【模板】拓扑排序#
【模板】拓扑排序
https://www.nowcoder.com/practice/88f7e156ca7d43a1a535f619cd3f495c
//拓扑排序模板
#include <bits/stdc++.h>
using namespace std;
#define MAX 200001
int main() {
int n, m;
cin >> n >> m;
vector<int> adjlist[MAX]; // 邻接链表vector容器
int inDegree[MAX] = {0}; // 记录入度数组
int a, b;
for(int i = 0; i < m; i++)
{
cin >> a >> b;
adjlist[a].push_back(b);
inDegree[b]++;
}
queue<int> que;
for(int i = 1; i <= n; i++)
{
if(inDegree[i] == 0)
que.push(i);
}
int cnt = 0; // 判断是否存在环
vector<int> res; // 用于存储结果
while(!que.empty())
{
int u = que.front();
que.pop();
res.push_back(u);
for(int i = 0; i < adjlist[u].size(); i++)
{
int v = adjlist[u][i];
inDegree[v]--;
if(inDegree[v] == 0)
que.push(v);
}
cnt++;
}
if(cnt == n){
for(int i = 0; i < res.size(); i++)
{
cout << res[i];
if(i != res.size() - 1)cout << " ";
}
}
else {
cout << -1;
}
}
// 64 位输出请用 printf("%lld")
