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 }

 

 

posted @ 2012-12-06 16:08  Naix_x  阅读(158)  评论(0编辑  收藏  举报