拓扑排序(输出字典序最小的)

 

题意: 拓扑排序,输出字典序最小的。

思路:优先队列优化。

#include <iostream>
#include <vector>
#include <queue>
#include<string.h>
using namespace std;
int n, m;
const int N=1e5+10;
vector<int> out[N];      //入度记录
int in[N];    //出度记录
vector<int>ret;
priority_queue<int,vector<int>,greater<int> > q;
int topsort(){
    while (!q.empty()){
        int idx = q.top();
        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()
{
    while(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();
        for(int i=0; i<_size-1; i++)
            cout<<ret[i]<<" ";
        cout<<ret[_size-1]<<endl;
        ret.clear();
        for(int i=1; i<=n; i++){
            out[i].clear();
        }
        memset(in,0,sizeof in);
    }
    return 0;
}
View Code

 

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