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;
}

 

posted @ 2021-01-05 13:16  君与  阅读(63)  评论(0编辑  收藏  举报