2.3.5 Controlling Companies

一道难题dfs,lrc说是网络流,百度说是dfs,于是我选择了dfs,思路大概如下:

  dfs(i,k)表示把i占有k以及k的子公司的股份计算出来,保存在dp数组里(无视名字),然后dfs,不过dfs要在她能控制某个公司才能dfs他的子公司,并且更可怕的是如果已经计算出能控制的公司,就不要做了 ,防止重复,怎么说呢,很难说明白,例如这个数据吧,

1 2 51

2 3 51

3 2 20

不知道是我程序问题还是什么的,这个数据会死循环,他会不断在2 3 之间重复计算,所以我加了个判断在找的子公司是否已经被控制了,是就不dfs,不是才dfs,终于过了这题,如果没有数据,我想我要做多几十天才做出来。。。

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<stdlib.h>
 5 #define max(a,b) a>b?a:b
 6 #define min(a,b) a>b?b:a
 7 #define INF     0x3f3f3f3f
 8 #define Maxin 10000
 9 int fang[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
10 int s[101][101],n;
11 int dp[101][101];
12 int v[101];
13 
14 int dfs(int i,int k)//找i享有k与保存其子公司的多少股份
15 {
16    int x;
17     for(x=1;x<=100;x++)
18     {
19         if(i!=x&&dp[i][x]<50)//这个判断很重要,防止死循环
20         {
21           dp[i][x]+=s[k][x];
22           if(dp[i][x]>=50)
23             dfs(i,x);
24         }
25     }
26     return 0;
27 }
28 
29 int main()
30 {
31     int x,y,n;
32     scanf("%d",&n);
33     memset(s,0,sizeof(s));
34     memset(dp,0,sizeof(dp));
35     memset(v,0,sizeof(v));
36     for(x=1;x<=n;x++)
37     {
38         int i,j,p;
39         scanf("%d%d%d",&i,&j,&p);
40         s[i][j]=p;
41     }
42     for(x=1;x<=100;x++)
43         dfs(x,x);
44 
45     for(x=1;x<=100;x++)
46         for(y=1;y<=100;y++)
47                if(dp[x][y]>=50)
48                  printf("%d %d\n",x,y);
49     return 0;
50 }

posted on 2012-06-14 17:37  usp10  阅读(179)  评论(1编辑  收藏  举报

导航