AcWing 848. 有向图的拓扑序列
原题链接
简单
BFS解决拓扑队列问题
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n, m;
int h[N], e[N], ne[N], idx;
//int h[N] 表示第i个节点的第一条边的idx
//int e[M] 表示第idx条边的终点
//int ne[M] 表示与第idx条边同起点的下一条边的idx
int q[N], d[N];
//d[N] 表示节点的入度
int add(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
bool topsort()
{
int hh=0, tt=-1;
for(int i=1; i<=n; i++)
if(!d[i]) q[++tt] = i;
while(hh <= tt)
{
int t = q[hh++];//取队头
//拓展队头元素
for(int i=h[t]; i!=-1; i=ne[i])
{
int j=e[i];
d[j]--;
if(d[j]==0) q[++tt] = j;
}
}
return tt == n-1;
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i=0; i<m; i++)
{
int a, b;
cin>>a>>b;
add(a,b);
d[b]++;
}
if(topsort())
{
for(int i=0; i<n; i++)
cout<<q[i]<<" ";
}
else cout<<"-1";
return 0;
}