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

Posted sszywq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拓扑排序(输出字典序最小的)相关的知识,希望对你有一定的参考价值。

技术图片

 

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

思路:优先队列优化。

技术图片
#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

 

以上是关于拓扑排序(输出字典序最小的)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1285 确定比赛名次字典序最小的拓扑排序 + 优先队列

拓扑排序+不是字典序的优先级排列(POJ3687+HDU4857)

[CF825E] Minimal Labels(反向建图,拓扑排序)

拓扑序列以及排序

[拓扑排序 反向建图] 825E - Minimal Labels

cogs1958 菜肴制作 拓扑排序