码迷,mamicode.com
首页 > 编程语言 > 详细

杭电4857--逃生(拓扑排序)

时间:2015-08-14 01:01:51      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

逃生

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2257    Accepted Submission(s): 637


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
 

 

Author
CLJ
 

 

Source
 

 

Recommend
We have carefully selected several similar problems for you:  5390 5389 5388 5387 5386 
RE: 逆向拓扑 + 优先队列 + 逆序输出。
 1 #include <queue>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 using namespace std;
 6 int head[100010], indegree[100010], result[100010];
 7 int n, m; 
 8 
 9 struct rode{
10     int to, next; 
11 } map[100010];
12 void Tsort(int n)
13 {
14     priority_queue<int> q; int k = 1, u;
15     for(int i = 1; i <= n; i++)
16         if(!indegree[i])
17             q.push(i);
18     while(!q.empty())
19     {
20         result[k++] = u = q.top();
21         q.pop();
22         for(int i = head[u]; i != -1; i = map[i].next)
23         {
24             if(!--indegree[map[i].to])
25                 q.push(map[i].to); 
26         }
27     }    
28     for(int i = n; i >= 1; i--)
29     {
30         if(i != 1)
31             printf("%d ", result[i]);
32         else
33             printf("%d\n", result[i]);
34         
35     }
36 }
37 int main()
38 {
39     int t;
40     scanf("%d", &t);
41     while(t--)
42     {
43         memset(indegree, 0, sizeof(indegree));
44         memset(head, -1, sizeof(head));
45         scanf("%d %d", &n, &m);
46         for(int i = 0; i < m; i++)
47         {
48             int a, b;
49             scanf("%d %d", &a, &b);
50             map[i].to = a;
51             map[i].next = head[b];
52             head[b] = i;
53             ++indegree[a];
54         }
55         Tsort(n);
56     } 
57     return 0;
58 }

 

 

杭电4857--逃生(拓扑排序)

标签:

原文地址:http://www.cnblogs.com/fengshun/p/4728843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!