拓扑排序(输出字典序最小的)
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; }
以上是关于拓扑排序(输出字典序最小的)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1285 确定比赛名次字典序最小的拓扑排序 + 优先队列
拓扑排序+不是字典序的优先级排列(POJ3687+HDU4857)
[CF825E] Minimal Labels(反向建图,拓扑排序)