逃生 (hdu 4857 拓扑排序+优先队列)
2017-07-23 15:43
330 查看
逃生
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Problem Description
糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很窄,大家只能排成一行。
现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。
同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。
负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推。
那么你就要安排大家的顺序。我们保证一定有解。
Input
第一行一个整数T(1 <= T <= 5),表示测试数据的个数。 然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <= 100000),分别表示人数和约束的个数。 然后m行,每行两个整数a和b,表示有一个约束a号必须在b号之前。a和b必然不同。
Output
对每个测试数据,输出一行排队的顺序,用空格隔开。
Sample Input
1
5 10
3 5
1 4
2 5
1 2
3 4
1 4
2 3
1 5
3 5
1 2
Sample Output
1 2 3 4 5
//拓扑排序(优先队列实现)模板
(vector是个容器,相当于一个邻接表)
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <cmath> #include <queue> #include <algorithm> using namespace std; const int MAX = 30000 + 100; int n; int cnt; int ans[MAX]; vector<int>map[MAX]; int indegree[MAX]; priority_queue<int>q; struct cmp{ bool operator()(int &a, int &b) { return a < b; } }; void toposort() { cnt = 0; for (int i = 1; i <= n; i++) { if (!indegree[i]) q.push(i); } while (!q.empty()) { int v = q.top(); q.pop(); for (int i = 0; i < map[v].size(); i++) { int u = map[v][i]; indegree[u]--; if (!indegree[u]) q.push(u); } ans[cnt++] = v; } } int main() { int T; int m; scanf("%d", &T); while (T--) { int a, b; scanf("%d%d", &n, &m); memset(indegree, 0, sizeof(0)); memset(ans, 0, sizeof(ans)); for (int i = 0; i <= n; i++) map[i].clear(); while (!q.empty()) q.pop(); for (int i = 0; i < m; i++) { scanf("%d%d", &a, &b); map[b].push_back(a); indegree[a]++; } toposort(); for (int i = cnt - 1; i > 0; i--) printf("%d ", ans[i]); printf("%d\n", ans[0]); } return 0; }
相关文章推荐
- HDU 4857 逃生 (反向拓扑排序+优先队列)
- HDU 4857 逃生(拓扑排序+优先队列+反向建边)
- HDU 4857 逃生(反向拓扑排序+优先队列)
- hdu 4857 逃生 拓扑排序+优先队列,逆向处理
- hdu 4857 逃生 反向拓扑排序+优先队列
- HDU 4857 逃生 拓扑排序+优先队列
- hdu 4857 逃生(拓扑排序)
- HDU 4857 逃生(逆向拓扑)
- HDU 1285 确定比赛名次 + HDU 4857 逃生(拓扑排序由浅入深)
- hdu 4857 逃生(拓扑排序)
- HDU-4857 逃生 【反向拓扑排序模板题+死环判定】
- HDU 4857 逃生 【逆拓扑 优先队列】
- 【CUGBACM15级BC第1场 A】hdu 4857 逃生
- hdu 4857 逃生(拓扑排序)
- hdu-----(4857)逃生(拓扑排序)
- HDU 4857 逃生 【拓扑排序+反向建图+优先队列】
- HDU 4857 逃生(反向拓扑排序)
- HDU 4857 逃生。
- hdu-4857-逃生
- 【HDU】4857--逃生(拓扑)