HDU 1285 确定比赛名次(字典序最小的拓扑排序)
2016-07-17 18:29
369 查看
题目链接:
HDU 1285 确定比赛名次
题意:
输出拓扑排序字典序最小的方案。
分析:
这道题和UESTC 1150 排名表区别还是(比较)明显的。
HDU 1285 确定比赛名次
题意:
输出拓扑排序字典序最小的方案。
分析:
这道题和UESTC 1150 排名表区别还是(比较)明显的。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <climits> #include <cmath> #include <ctime> #include <vector> #include <queue> #include <cassert> #define IOS ios_base::sync_with_stdio(0); cin.tie(0); using namespace std; typedef long long ll; const int MAX_N = 510; vector<int> vec[MAX_N]; priority_queue<int, vector<int>, greater<int> > que; int degree[MAX_N], ans[MAX_N]; void TopoSort(int n) { while(!que.empty()) que.pop(); for(int i = 1; i <= n; ++i) { if(degree[i] == 0) que.push(i); } int step = 1; while(!que.empty()) { int cur = que.top(); que.pop(); ans[step++] = cur; for(int i = 0; i < vec[cur].size(); ++i) { int to = vec[cur][i]; degree[to]--; if(degree[to] == 0) que.push(to); } } for(int i = 1; i <= n; ++i) { printf("%d", ans[i]); if(i < n) printf(" "); else printf("\n"); } } int main() { int n, m; while(~scanf("%d%d", &n, &m)) { for(int i = 1; i <= n; ++i) { vec[i].clear(); } memset(degree, 0, sizeof(degree)); for(int i = 0; i < m; ++i) { int u, v; scanf("%d%d", &u, &v); degree[v]++; vec[u].push_back(v); } TopoSort(n); } return 0; }
相关文章推荐
- 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
- 优先队列(priority_queue)的C语言实现代码
- PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
- 堆排序/优先级队列
- 初学图论-Kahn拓扑排序算法(Kahn's Topological Sort Algorithm)
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- 反向拓扑排序 HDU 4857 逃生