将所有入度为0的顶点入队;
遍历队列,将顶点加入拓扑序列,并将相邻顶点入度减1,若为0,则加入队列;
若拓扑序列长度等于顶点数n,则输出序列;否则图中存在环,输出-1。
#include <iostream>
#include<vector>
#include<queue>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m;
cin>>n>>m;
vector<vector<int>>adj(n+1);
vector<int>in_d(n+1,0);
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
adj[u].push_back(v);
in_d[v]++;
}
queue<int>q;
for(int i=1;i<=n;i++){
if(in_d[i]==0)q.push(i);
}
vector<int>res;
while(!q.empty()){
int u=q.front();
q.pop();
res.push_back(u);
for(int v:adj[u]){
if(--in_d[v]==0)q.push(v);
}
}
if(res.size()!=n)cout<<-1<<endl;
else{
for(int i=0;i<n;i++){
if(i)cout<<' ';
cout<<res[i];
}
cout<<endl;
}
return 0;
}

京公网安备 11010502036488号