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 }