POJ 3687 Labeling Balls【拓扑排序】
题意: 有 n 个球,想要对他们进行编号1..n,知道了一些求的轻重的关系,要求轻的球必须排在重的球之前,如果存在没有冲突的排序方法的话,输出字典序最小的排序方式。
分析: 没考虑重边,WA了N次!!谨记!
由于要输出字典序最小的情况,所以建图要反向建图,反向进行拓扑排序。
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) int g[202][202]; int indegree[202]; int res[202]; int v[202][202]; int main() { bool flag; int n,m,i,j,k,t,a,b; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); clr(indegree); clr(g); clr(v); flag=false; while(m--) { scanf("%d%d",&a,&b); if(!v[b][a]){ v[b][a]=1; g[b][a]=1; indegree[a]++; } } flag=false; for(i=n;i>=1;i--) { flag=true; for(j=n;j>=1;j--) { if(indegree[j]==0) { flag=false; res[j]=i; indegree[j]=-1; for(k=1;k<=n;k++) if(g[j][k]) indegree[k]--; break; } } if(flag) break; } if(flag)printf("-1\n"); else { for(i=1;i<=n;i++) printf("%d%c",res[i],i==n?'\n':' '); } } return 0; }