拓补排序板子(邻接表实现)

#include <iostream>
#include<vector>
using namespace std;
const int maxn=2e5+5;
vector<int>graph[maxn];//邻接表

void addedge(int u,int v)
{
    graph[u].emplace_back(v);
}

int indegree[maxn];//入度表

int main() {
    int n,m;cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int u,v;cin>>u>>v;
        addedge(u,v);
        indegree[v]++;
    }
    vector<int>qu;int l=0,r=0;
    for(int i=1;i<=n;i++)//节点从1~n
    {
        if(indegree[i]==0)
        {
            qu.emplace_back(i);
            r++;
        }
    }
    int cnt=0;
    while(l<r)
    {
        cnt++;
        int cur=qu[l++];
        for(auto next:graph[cur])
        {
            if(--indegree[next]==0)
            {
                qu.emplace_back(next);
                r++;
            }
        }
    }
    if(cnt==n){
        for(int i=0;i<qu.size()-1;i++)cout<<qu[i]<<' ';//如果存在拓补序(即不带环)
        cout<<qu[qu.size()-1];
    }else{
        cout<<-1;
    }
    return 0;
}
posted @   Marinaco  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示