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\n");

51         else{

52             printf("%d",ans[1]);

53             for(i=2;i<=n;i++) printf(" %d",ans[i]);

54             printf("\n");

55         }        

56     }

57     return 0;

58 }
View Code

 

 

 

 

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

你可能感兴趣的:(label)