https://www.acwing.com/problem/content/850/

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
vector<int> p[N];    //vector变长数组来写邻接表 
queue<int> q;        //队列操作 
int d[N];            //统计入度 
int n,m,cnt,ans[N];  //ans数组记录答案 
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        p[x].push_back(y); //构造邻接表 
        d[y]++;    //入度++ 
    }
    for(int i=1;i<=n;i++)
    {
        if(!d[i]) q.push(i); //统计最初入度,找入度为0的点 
    }
    while(q.size())
    {
        int t=q.front();
        q.pop();
        ans[cnt++]=t;
        for(int i=0;i<p[t].size();i++)
        {
            d[p[t][i]]--;   //删边操作 
            if(d[p[t][i]]==0) q.push(p[t][i]); //如果删完边后入度为0了,放入队列 
        }
    }
    if(cnt==n) for(int i=0;i<cnt;i++) printf("%d ",ans[i]); //存在拓扑序列打印 
    else printf("-1");
}

 

posted on 2023-03-30 17:24  ljq0120  阅读(11)  评论(0编辑  收藏  举报