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

#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 @ 2025-01-11 19:22  Marinaco  阅读(39)  评论(0)    收藏  举报
//雪花飘落效果