POJ 3687 Labeling Balls【拓扑排序 优先队列】

题意:给出n个人,m个轻重关系,求满足给出的轻重关系的并且满足编号小的尽量在前面的序列

因为输入的是a比b重,但是我们要找的是更轻的,所以需要逆向建图

逆向建图参看的这一篇http://blog.csdn.net/scf0920/article/details/28108243

然后用优先队列来实现的参看的这一篇

http://ycool.com/post/u9ahrwg#algo3

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<queue> 
 9 #include<algorithm>  
10 #define mod=1e9+7;
11 using namespace std;
12 
13 typedef long long LL;
14 const int maxn=1005;
15 int g[maxn][maxn],out[maxn],ans[maxn];
16 
17 int main(){
18     int t,n,m,u,v,tmp,i,j;
19     scanf("%d",&t);
20     while(t--){
21         memset(g,0,sizeof(g));
22         memset(out,0,sizeof(out));
23         cin>>n>>m;
24         for(i=0;i<m;i++){
25             cin>>u>>v;
26             if(!g[u][v]){
27                 g[u][v]=1;
28                 out[u]++;
29             }
30         }
31         priority_queue<int> q;
32         for(i=1;i<=n;i++){
33             if(out[i]==0) q.push(i);
34         }
35         
36         for(i=n;i>=1;i--){
37             if(q.empty()) break;
38             u=q.top();q.pop();//取出队列中编号最大的数 
39             ans[u]=i;//使得大的数尽量往后面放 
40             for(j=1;j<=n;j++){
41                 if(g[j][u]){
42                     g[j][u]=0;
43                     out[j]--;
44                     if(out[j]==0) q.push(j);
45                 }
46                 
47             }
48         }
49         
50         if(i) printf("-1
");
51         else{
52             printf("%d",ans[1]);
53             for(i=2;i<=n;i++) printf(" %d",ans[i]);
54             printf("
");
55         }        
56     }
57     return 0;
58 }
View Code

go---go----寒假学的拓扑排序都忘得七七八八的说了= =这一题的反向建图再好好理解

原文地址:https://www.cnblogs.com/wuyuewoniu/p/4340449.html