标签:
题意:给出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 }
go---go----寒假学的拓扑排序都忘得七七八八的说了= =这一题的反向建图再好好理解
POJ 3687 Labeling Balls【拓扑排序 优先队列】
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4340449.html