AcWing 848. 有向图的拓扑序列
给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。
请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出-1。
若一个由图中所有点构成的序列A满足:对于图中的每条边(x, y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。
#include<bits/stdc++.h> #define N 1000000 using namespace std; int head[N],net[N],t[N]; int du[N],k[N]; int cut,n,m,num; void add(int from,int to) { net[++cut]=head[from]; t[cut]=to; head[from]=cut; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); add(x,y); du[y]++; } for(int i=1;i<=n;i++) if(du[i]==0)k[++num]=i; int w=0; while(w<=num) { w++; int x=k[w]; for(int i=head[x];i;i=net[i]) if(!--du[t[i]])k[++num]=t[i]; } if(w<n)puts("-1"); else for(int i=1;i<=num;i++) printf("%d ",k[i]); return 0; }