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 }