标签:style blog color os io 数据 for ar
【题意】:n个重量为1~n的球,给定一些球之间的重量比较关系(如 2 1 表示第二个球比第一个球轻),求每个球可能的重量,ans[i] 表示第i个球的重量,要求输出的是ans字典序最小的情况。
【思路】:对于给出的a b 建反边,每次 在出度为0的所有点里选一个序号最小的赋值(从n开始 由大到小赋)。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<map> 7 #include<queue> 8 #include<stack> 9 #include<set> 10 #include<cmath> 11 #include<vector> 12 #define inf 0x3f3f3f3f 13 #define Inf 0x3FFFFFFFFFFFFFFFLL 14 #define eps 1e-9 15 #define pi acos(-1.0) 16 using namespace std; 17 18 int in[202],ans[202]; 19 bool g[202][202],vis[202]; 20 priority_queue<int>q; 21 22 int main() 23 { 24 int i,t,j,n,m,a,b; 25 scanf("%d",&t); 26 while(t--) 27 { 28 //getchar(); 29 scanf("%d%d",&n,&m); 30 memset(in,0,sizeof(in)); 31 memset(g,false,sizeof(g)); 32 memset(vis,false,sizeof(vis)); 33 while(m--) 34 { 35 scanf("%d%d",&a,&b); 36 if(g[b][a]) 37 continue; 38 g[b][a]=true; 39 in[a]++; 40 } 41 for(i=1;i<=n;i++) 42 if(in[i]==0) 43 { 44 q.push(i); 45 vis[i]=true; 46 } 47 int num=n; 48 for(i=0;i<n;i++)//每次一个出度为0的序号最小的 49 { 50 int temp; 51 if(q.empty()) 52 break; 53 temp=q.top();q.pop(); //printf("i %d \n",temp); 54 ans[temp]=num--; 55 for(int j=1;j<=n;j++) 56 if(j!=temp&&g[temp][j]) 57 { 58 in[j]--; 59 if(in[j]==0&&!vis[j]) 60 { 61 q.push(j); 62 vis[j]=true; 63 } 64 } 66 } 67 //printf("ans "); 68 if(i<n) 69 printf("-1\n"); 70 else 71 { 72 printf("%d",ans[1]); 73 for(i=2;i<=n;i++) 74 printf(" %d",ans[i]); 75 printf("\n"); 76 } 77 } 78 79 }
考虑这组数据:
2 5 4 1 4 4 2 5 3 3 2 5 3 1 4 4 2 3 5 输出应该是: 1 5 3 4 2 1 3 4 2 5
poj3687 拓扑排序 还没怎么搞明白 回头再想想,布布扣,bubuko.com
标签:style blog color os io 数据 for ar
原文地址:http://www.cnblogs.com/assult/p/3895050.html