USACO 2.3 Controlling Companies(DFS)

好高端DFS,一开始土土的DFS了一下,挂了,想了想,应该是一个公司合并子公司的时候,对某些公司的股份>50了,但是在前面就没办法更新了,然后搞了一下让他从头遍历。然后一直又多加了。。。不知如何乱搞,根本想不清楚,递归起来怎么变化的。本来标记数组在函数内部的,开了个全局的终于乱搞对了。。。

 1 /*

 2  ID: cuizhe

 3  LANG: C++

 4  TASK: concom

 5 */

 6 #include <iostream>

 7 #include <cstdio>

 8 #include <cstring>

 9 #include <cmath>

10 #include <algorithm>

11 using namespace std;

12 int p[101][101],o[101],n,key[101];

13 void dfs(int x)

14 {

15     int i,j;

16     o[x] = 1;

17     for(i = 1; i <= 100; i ++)

18     {

19         if(p[x][i] > 50&&x != i&&!key[i])

20         {

21             if(!o[i]) dfs(i);

22             key[i] = 1;

23             for(j = 1; j <= 100; j ++)

24             {

25                 p[x][j] += p[i][j];

26             }

27             i = 1;

28         }

29     }

30 }

31 int main()

32 {

33     int sv,ev,i,w,j;

34     freopen("concom.in","r",stdin);

35     freopen("concom.out","w",stdout);

36     scanf("%d",&n);

37     for(i = 1; i <= n; i ++)

38     {

39         scanf("%d%d%d",&sv,&ev,&w);

40         p[sv][ev] = w;

41     }

42     for(i = 1; i <= 100; i ++)

43     {

44         if(!o[i])

45         {

46             dfs(i);

47         }

48     }

49     for(i = 1; i <= 100; i ++)

50     {

51         for(j = 1; j <= 100; j ++)

52         {

53             if(p[i][j] > 50&&i != j)

54                 printf("%d %d\n",i,j);

55         }

56     }

57     return 0;

58 }

你可能感兴趣的:(USACO)