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 }
posted @ 2012-11-13 21:45  Naix_x  阅读(213)  评论(0编辑  收藏  举报