题解 | #【模板】拓扑排序#

【模板】拓扑排序

https://www.nowcoder.com/practice/88f7e156ca7d43a1a535f619cd3f495c

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn=1e5+100;
int ne[maxn],e[maxn],h[maxn],idx,q[maxn],d[maxn];
void 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]==0) {
            q[++tt]=i;
        }
    }
    while(hh<=tt)
    {
        auto 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()
{
    memset(h,-1,sizeof h);
    int i,j,a,b;
    cin>>n>>m;
    for(i=0;i<m;i++){
        cin>>a>>b;
        add(a,b);
        d[b]++;
    }
    if(topsort())
    {
        for(i=0;i<n;i++){
            cout<<q[i]<<" ";

        }
        cn;
    }
    else
    {
        cout<<-1<<endl;
    }
    return 0;
}


全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务