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 }

 

 

你可能感兴趣的:(label)