POJ 3687 Labeling Balls(拓扑排序)
经讲解后过了,对题意和拓扑排序都不怎么会。正向建图,找标号小的入度为0的点,是错误的。。。正解反向建图,然后把找到标号大的入度为0的点,然后把大的重量赋给他。如何证明的,我不懂。。。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 using namespace std; 5 int p[201][201],in[201],out[201],o[201],n; 6 int judge() 7 { 8 int i,j,t,z; 9 for(i = n; i >= 1; i --) 10 { 11 z = 1; 12 for(j = 1; j <= n; j ++) 13 { 14 if(in[j] == 0) 15 { 16 t = j; 17 z = 0; 18 } 19 } 20 if(z) return 0; 21 o[t] = i; 22 in[t] = -1; 23 for(j = 1; j <= n; j ++) 24 { 25 if(p[t][j]) 26 { 27 in[j]--; 28 } 29 } 30 } 31 return 1; 32 } 33 int main() 34 { 35 int i,m,t,sv,ev; 36 scanf("%d",&t); 37 while(t--) 38 { 39 memset(p,0,sizeof(p)); 40 memset(in,0,sizeof(in)); 41 memset(out,0,sizeof(out)); 42 scanf("%d%d",&n,&m); 43 for(i = 1; i <= m; i ++) 44 { 45 scanf("%d%d",&sv,&ev); 46 if(!p[ev][sv]) 47 { 48 p[ev][sv] = 1; 49 in[sv] ++; 50 out[ev] ++; 51 } 52 } 53 if(judge()) 54 { 55 for(i = 1; i <= n; i ++) 56 { 57 if(i == 1) 58 printf("%d",o[i]); 59 else 60 printf(" %d",o[i]); 61 } 62 printf("\n"); 63 } 64 else 65 printf("-1\n"); 66 } 67 return 0; 68 }