HDU 4857 逃生(拓扑排序逆向+邻接表存图)

Posted leonard-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4857 逃生(拓扑排序逆向+邻接表存图)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857

题目:

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
 
题解:这道题目和上篇博客一样都要逆向建图。用邻接表存图,跑下优先队列的那种拓扑排序即可。
 1 #include <stack>
 2 #include <queue>
 3 #include <vector>
 4 #include <cstdio>
 5 #include <cstring>
 6 using namespace std;
 7 
 8 const int N=30000+10;
 9 int n,m;
10 int in[N];
11 stack <int> ans;
12 vector <int> E[N];
13 priority_queue <int> Q;
14 
15 void toposort(){
16     for(int i=1;i<=n;i++) if(!in[i]) Q.push(i);
17     while(!Q.empty()){
18         int u=Q.top();Q.pop();
19         ans.push(u);
20         for(int j=0;j<E[u].size();j++){
21             int v=E[u][j];
22             in[v]--;
23             if(in[v]==0) Q.push(v);
24         }
25     }
26 }
27 
28 void init(){
29     for(int i=0;i<N;i++) E[i].clear();
30     memset(in,0,sizeof(in));
31 }
32 
33 int main(){
34     int t;
35     scanf("%d",&t);
36     while(t--){
37         int a,b;
38         init();
39         scanf("%d%d",&n,&m);
40         for(int i=1;i<=m;i++){
41             scanf("%d%d",&a,&b);
42             in[a]++;
43             E[b].push_back(a);
44         }
45         toposort();
46         while(!ans.empty()){
47             if(ans.size()==1) printf("%d\n",ans.top());
48             else printf("%d ",ans.top());
49             ans.pop();
50         }
51     }
52     return 0;
53 }

 

以上是关于HDU 4857 逃生(拓扑排序逆向+邻接表存图)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 4857 逃生 拓扑排序+逆向建图

HDU-4857 逃生(逆向拓扑排序)

图论基础——邻接链表存图+拓扑排序

逃生(HDU4857 + 反向拓扑排序)

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

hdu4857 逃生反向建图+拓扑排序