#include<iostream>
#include<cmath>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,m,a,b;
int e[N],ne[N],h[N],idx;
int d[N],top[N],cnt=1;//top是拓扑排序的序列,cnt代表top中有多少元素
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool topsort()
{
queue<int> q;
int t;
for(int i=1;i<=n;i++)
if(d[i]==0) q.push(i);//将所有入度为0的点都加入到队列之中
while(q.size())
{
t=q.front();//每次取出队头
top[cnt]=t;//加入到拓扑排序之中
cnt++;//拓扑排序中的元素加1
q.pop();
for(int i=h[t];i!=-1;i=ne[i])//遍历t点的出边
{
int j=e[i];
d[j]--;//入度减少
if(d[j]==0) q.push(j);//如果j的入度为0,加入到队列之中
}
}
if(cnt<n) return 0;
else return 1;
}
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
memset(h,-1,sizeof h);//邻接表一开始没有装入任何数据,下标就是都是从-1开始的
cin>>n>>m;
while(m--)
{
cin>>a>>b;
add(a,b);
d[b]++;//a到b b的入度++
}
if(topsort()==0) cout<<"-1"<<endl;
else
{
for(int i=1;i<=n;i++)
cout<<top[i]<<" ";
cout<<endl;
}
return 0;
}
AcWing 848. 有向图的拓扑序列
最新推荐文章于 2024-09-11 11:31:11 发布