【HDOJ】4857 逃生

很容易想到优先队列+拓扑排序。关键点是有限制条件者有限,无限制条件者在最后,条件相同者按序输出。因此采用逆序。

 1 #include <iostream>
 2 #include <queue>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <cstring>
 6 using namespace std;
 7
 8 #define MAXN 30005
 9
10 typedef struct {
11     int to, next;
12 } edge_st;
13
14 edge_st edges[100005];
15 int adj[MAXN], L;
16 int deg[MAXN];
17 int buf[MAXN];
18
19 typedef struct node_st{
20     int i;
21     node_st() {}
22     node_st(int ii) {
23         i = ii;
24     }
25     friend bool operator <(node_st a, node_st b) {
26         return a.i < b.i;
27     }
28 } node_st;
29
30 void add(int u, int v) {
31     edges[L].to = v;
32     edges[L].next = adj[u];
33     adj[u] = L++;
34     ++deg[v];
35 }
36
37 void init() {
38     L = 1;
39     memset(deg, 0, sizeof(deg));
40     memset(adj, 0, sizeof(adj));
41 }
42
43 int main() {
44     int T, n, m;
45     int i, j, k;
46     node_st nd;
47
48     scanf("%d", &T);
49     while (T--) {
50         scanf("%d%d", &n, &m);
51         init();
52         while (m--) {
53             scanf("%d %d", &j, &k);
54             add(k, j);
55         }
56         priority_queue<node_st> Q;
57         for (i=1; i<=n; ++i)
58             if (deg[i] == 0)
59                 Q.push(node_st(i));
60         k = 0;
61         while (!Q.empty()) {
62             nd = Q.top();
63             buf[k++] = nd.i;
64             Q.pop();
65             for (i=adj[nd.i]; i; i=edges[i].next) {
66                 deg[edges[i].to]--;
67                 if (deg[edges[i].to] == 0)
68                     Q.push(node_st(edges[i].to));
69             }
70         }
71         for (i=k-1; i>=0; --i)
72             if (i)
73                 printf("%d ", buf[i]);
74             else
75                 printf("%d\n", buf[i]);
76     }
77
78     return 0;
79 }
时间: 2024-08-03 20:52:47

【HDOJ】4857 逃生的相关文章

hdoj 4857 逃生(逆向拓扑排序+优先队列)

逃生 点击打开链接 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2161    Accepted Submission(s): 608 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前

HDOJ 4857 逃生

BestHack.....真乱..... 逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 139    Accepted Submission(s): 20 Problem Description 糟糕的事情发生啦,如今大家都忙着逃命.可是逃命的通道非常窄.大家仅仅能排成一行. 如今有n个人,从1标号到n.同一时候有一些奇怪的约束

hdu 4857 逃生 (拓扑排序+保证最小在前面)

逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 74    Accepted Submission(s): 13 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前. 同时,社会是不平

HDOJ 4868 逃生

BestHack.....真乱..... 逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 139    Accepted Submission(s): 20 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每

HDU 4857 逃生 (反向拓扑排序 &amp; 容器实现)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4505    Accepted Submission(s): 1282 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排

HDU 4857 逃生 (优先队列+反向拓扑)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 解题报告:有n个点,有m个条件限制,限制是像这样的,输入a  b,表示a必须排在b的前面,如果不能确定两个数谁排在前面则尽量把小的排在前面. 首先把出度为0的点加入到优先队列中,然后每次用优先队列中弹出的点去更新其它点的出度,更新的同时如果又有其它点的出度为0的话又加到优先队列中, 最后按照从优先队列中出队的反序输出就可以了.我还是不懂为什么按照入度为0然后加入到优先队列然后正序输出这样为什么

hdu 4857 逃生 拓扑排序+优先队列,逆向处理

hdu4857 逃生 题目是求拓扑排序,但不是按照字典序最小输出,而是要使较小的数排在最前面. 一开始的错误思路:给每个点确定一个优先级(该点所能到达的最小的点),然后用拓扑排序+优先对列正向处理,正向输出.这是错误的,如下样例: 1 5 4 5 2 4 3 2 1 3 1 正确的解法:是反向建边,点大的优先级高,用拓扑排序+优先队列,逆向输出序列即可. 根据每对限制,可确定拓扑序列,但此时的拓扑序列可能有多个(没有之间关系的点的顺序不定).本题要求较小的点排到前面,则可确定序列. (1)如果点

hdu 4857 逃生(拓扑逆排序+优先队列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943

hdu 4857 逃生(拓扑排序逆序 + 优先队列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 题意:有编号 1 - n 的 n 个人逃生,编号越小的人越有钱, 在满足 m 个前提的条件下要尽可能早的逃脱 .m个前提,对于每个前提 a , b,代表 a 要早于 b逃脱. 思路: (1)这题可以理解为有钱的人优先级越高,所以可以用优先队列. (2)但是要注意这道题和字典序升序的区别. eg:5 1 5 1 按照字典序的答案:2 3 4 5 1,    本题答案: 5 1 2 3 4. 因为