题目链接:https://www.acwing.com/problem/content/description/850/
题目如下:
#include <iostream>
#include <algorithm>
#include <cstring>//memset
#include <queue>
using namespace std;
const int N=100010;
int n,m;
vector<int> g[N];//存储邻接表
int in[N];//存储入度
vector<int> res;//存储入队顺序
bool topsort(){//拓扑排序
queue<int> que;//表明此时有哪些点的入度为0
for(int i=1;i<=n;i++){//点的范围1~n
if(in[i]==0) que.push(i);
}
while(que.size()){
auto t=que.front();
que.pop();
res.push_back(t);
for(auto e:g[t]){//遍历所有以t为头的尾点,然后将对应的入度-1,若入度为0,则加入队列
in[e]--;
if(in[e]==0) que.push(e);
}
}
return res.size()==n;//判断是否所有点都已放入
}
int main(){
cin>>n>>m;//n个节点,m条边
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
g[a].push_back(b);
in[b]++;
}
if(topsort()){
for(auto e:res){
cout<<e<<" ";
}
cout<<endl;
}else cout<<"-1"<<endl;
return 0;
}