和poj 1655类似,也是拆了一个树求什么值。这题我改进了一下,把两个DFS合一了。
1 #include <stdio.h> 2 #define N 50005 3 int fst[N],nxt[N<<1],to[N<<1]; 4 int n,s[N],w[N],min; 5 int dfs(int u,int fa) 6 { 7 int i,v,t=n-1; 8 s[u] = 1; w[u] = 0; 9 for(i = fst[u]; i != 0; i = nxt[i]) 10 { 11 v = to[i]; 12 if(v != fa) 13 s[u] += dfs(v,u); 14 } 15 //printf("s[%d]:%d\n",u,s[u]); 16 for(i = fst[u]; i != 0; i = nxt[i]) 17 { 18 v = to[i]; 19 if(v != fa) 20 { 21 t -= s[v]; 22 if(s[v] > w[u]) w[u]=s[v]; 23 } 24 } 25 if(t > w[u]) w[u]=t; 26 //printf("w[%d]:%d\n",u,w[u]); 27 if(w[u] < min) min = w[u]; 28 return s[u]; 29 } 30 int main() 31 { 32 int a,b,i,j,f=1; 33 scanf("%d",&n); 34 min = n; 35 for(i = j = 1; j < n; j++) 36 { 37 scanf("%d%d",&a,&b); 38 to[i] = b; 39 nxt[i] = fst[a]; 40 fst[a] = i++; 41 to[i] = a; 42 nxt[i] = fst[b]; 43 fst[b] = i++; 44 } 45 dfs(1,0); 46 for(i = 1; i <= n; i++)if(w[i] == min) 47 { 48 if(f) printf("%d",i), f = 0; 49 else printf(" %d",i); 50 } 51 printf("\n"); 52 return 0; 53 }