拓扑排序(模板)

 

 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n, m;
const int N=1e5+10;
vector<int> out[N];      //入度记录
int in[N];    //出度记录
vector<int>ret;
queue<int> q;
int topsort()
{
    while (!q.empty())
    {
        int idx = q.front();
        q.pop();
        ret.push_back(idx);
        //抹掉这个点的所有出度边 与入度计数
        int _size=out[idx].size();
        for (int i=0; i<_size; i++)
        {
            int e=out[idx][i];
            in[e]--; //该点入度减1
            if (in[e] == 0)
            {
                q.push(e);
            }
        }
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 0; i < m; i++){
        int start;
        int end;
        cin >> start >> end;
        in[end]++;
        out[start].push_back(end);
    }
    for (int i = 1; i <= n; i++){
        //找到第一个入度为0的点
        if (in[i] == 0){
            q.push(i);
        }
    }
    topsort();
    int _size=ret.size();
    if(_size==n){
        for(int i=0; i<_size; i++)
            cout<<ret[i]<<" ";
    }
    else
        cout<<"-1"<<endl;


    return 0;
}
/*3 3
1 2
2 3
1 3*/
View Code

 

posted @ 2020-10-28 19:25  Swelsh-corgi  阅读(91)  评论(0编辑  收藏  举报