有向图的拓扑序列

发布时间 2023-04-20 18:48:16作者: 艾鑫4646
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,m;
int h[N],e[N],ne[N],idx;
int d[N];//入线
int q[N];
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])
            q[ ++ tt] = i;

    while (hh <= tt)
    {
        int t = q[hh ++ ];

        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (-- d[j] == 0)
                q[ ++ tt] = j;
        }
    }

    return tt == n - 1;
}

int main(){
   cin>>n>>m;
   int a,b;
   memset(h,-1,sizeof(h));
    for (int i = 0; i < m; i ++ ){
      cin>>a>>b;
      add(a,b);
      d[b]++;
   }
   if(!topsort())  cout<<"-1"<<endl;
   else
 for(int i=0;i<n;i++){
      printf("%d ",q[i]);
 }
   return 0;
}