拓扑排序

拓扑序列概念:
若一个由图中所有点构成的序列 A满足:对于图中的每条边 (x,y),x 在 A中都出现在 y之前,则称 A 是该图的一个拓扑序列。

有向无环图才有拓扑序列

AcWing-848

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N=1e5+10;

int n,m;
int h[N],e[N],ne[N],idx;
int q[N];//队列
int d[N];//每一个点的入度

void add(int x,int y)//邻接表
{
    e[idx]=y;
    ne[idx]=h[x];
    h[x]=idx++;
}

bool topsort()//拓扑序列判断
{
    int hh=0;int tt=-1;
    
    for(int i=1;i<=n;i++)
        if(!d[i])//入度为0
        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;//入度为0入队
        }
    }
    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]++;//入度加1
    }
    
    if(topsort())
    {
        for(int i=0;i<n;i++) cout<<q[i]<<' ';
        puts("");
    }
    else cout<<-1<<endl;
    
    return 0;
}

posted @   Eric`  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示