POJ 3687 Labeling Balls
无奈了,巨坑陷阱题加读错题导致了N个WA。
题意是这样的:
给定几个标签球的重量大小关系,求每个球是第几重的(即每个球在所有球的重量中由小到大排名是多少)。
(输出是每个球第几重,而不是几号球比几号球重!)。
此题重点是:
1、需要逆序拓扑,找入读为零的点时要从大到小找。
2、注意最后的处理,是输出几号球是第几重的!!
例如:拓扑出的序列是1 4 2 3 5,就是4号球比1号球重,2号球比4号球重,输出序列是1 3 4 2 5,即1号球最轻,2号球第三轻……
是不是你也突然发现你读错题了?
下面是代码:
#include <stdio.h> #include <string.h> const int M=205; int n,cut,head[M],map1[M][M],ji[M]; int topo() { int i,in=-1,ind,di[M],j,k; cut=0; for(i=0; i<n; i++) { di[i]=0; for(j=0; j<n; j++) { di[i]+=map1[j][i]; } } for(i=0; i<n; i++) { for(j=n-1; j>=0; j--) { if(di[j]==0) { di[j]=-1; break; } } if(j==-1) { return 0; } for(k=0; k<n; k++) { di[k]-=map1[j][k]; } ji[i]=j; } return 1; } int main() { int t; scanf("%d",&t); while(t--) { int i,m,flat=1,a,b,ans[M]; scanf("%d%d",&n,&m); memset(map1,0,sizeof(map1)); for(i=0; i<m; i++) { scanf("%d%d",&a,&b); a--; b--; map1[b][a]=1; } i=topo(); if(i) { for(i=0; i<n; i++)//最后的数据处理 { ans[ji[i]+1]=n-i; } for(i=1; i<n; i++) { printf("%d ",ans[i]); } printf("%d\n",ans[n]); } else { printf("-1\n"); } } return 0; }