题意:给你n个公司股份的关系,一个公司控制另一个公式的条件是这个公司拥有另一个公司50% 或以上的股份,或者这个公司控制的子公司拥有另一家公司的股份总数>=50%;
解题思路:对每一个公司进行查找,对它的子公司进行搜索,如果多出来了一个子公司,则重新搜索这个公司
解题代码:
1 // File Name: concom.c 2 // Author: darkdream 3 // Created Time: 2013年12月11日 星期三 13时12分05秒 4 /* 5 ID: dream.y1 6 PROG: concom 7 LANG: C++ 8 */ 9 #include<stdio.h> 10 #include<string.h> 11 #include<stdlib.h> 12 #include<time.h> 13 #include<math.h> 14 int hs[200][200] = {0}; 15 double map[200][200] = {0}; 16 int k; 17 int visit[200] = {0}; 18 void dfs() 19 { 20 for(int i = 1;i <= 100 ;i ++) 21 { 22 int ok = 0 ; 23 if(hs[k][i] && !visit[i] ) 24 { 25 visit[i] = 1; 26 for(int j = 1;j <= 100 ;j ++) 27 { 28 map[k][j] += map[i][j]; 29 if(map[k][j] >= 0.5) 30 { 31 hs[k][j] = 1; 32 ok = 1; 33 } 34 } 35 36 } 37 if(ok) 38 i = 0 ; 39 } 40 } 41 int main(){ 42 freopen("concom.in","r",stdin); 43 freopen("concom.out","w",stdout); 44 int n ; 45 scanf("%d",&n); 46 for(int i = 1;i <= n;i ++) 47 { 48 int a, b ,temp; 49 scanf("%d %d %d",&a,&b,&temp); 50 map[a][b] = temp*1.0/100; 51 if(map[a][b] >= 0.5- 1e-8) 52 { 53 hs[a][b] = 1; 54 } 55 } 56 for(k =1 ;k <= 100; k ++) 57 { 58 memset(visit,0,sizeof(visit)); 59 visit[k] = 1; 60 dfs(); 61 } 62 for(int i = 1;i <= 100;i ++) 63 for(int j = 1; j<= 100 ;j ++) 64 { 65 if(hs[i][j] && i != j ) 66 printf("%d %d ",i,j); 67 } 68 return 0 ; 69 }