题目:
给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。
请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。
若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。
关键点:
使用BFS。记录有向图各点的入度,所有入度为0的点入队,出队时所有邻接点入度 -1。
代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5+10;
int n,m,res[N],g[N],d[N],e[N],ne[N],idx,q[N],hh,tt;
void add(int a,int b)
{
e[idx] = b,ne[idx] = g[a],g[a] = idx++;
}
void topo()
{
//int count = 0;
for(int i = 1;i <= n;i++)
if(d[i] == 0) q[tt++] = i;
while(hh < tt)
{
int i = q[hh++];
//res[count++] = i;
for(int j = g[i]; j != -1; j = ne[j])
{
d[e[j]]--;
if(d[e[j]] == 0) q[tt++] = e[j];
}
//g[i] = -1;
}
if(tt == n)
for(int i = 0;i <n;i++) cout << q[i] << ' ';
else cout << -1;
}
int main()
{
cin >> n >> m;
memset(g,-1,sizeof g);
while(m--)
{
int a,b;
cin >> a >> b;
add(a,b),d[b]++;
}
topo();
return 0;
}