poj1955 Balancing Act

来源:互联网 发布:mac sdk环境变量 编辑:程序博客网 时间:2024/05/21 15:50

题意:
就是去掉树上的一个节点,看看剩下的子树中最大的是多少,然后在这些最大值中求一个最小值,如果有多个点都是最小值,输出序号最小的。
思路:一遍dfs ,保存求出每个点的子树里最大的节点个数。

#include<cstdio>#include<cstring>#include<vector>#include<iostream>using namespace std;const int N=20000+10;int sum[N],ans[N],n,m;vector<int>E[N];void dfs(int cur,int father){   sum[cur]=1;   for(int i=0;i<E[cur].size();i++){       int son=E[cur][i];       if(son==father) continue;       dfs(son,cur);       sum[cur]+=sum[son];       ans[cur]=max(ans[cur],sum[son]);   }   ans[cur]=max(ans[cur],n-sum[cur]);}int main(){   int T;scanf("%d",&T);   while(T--){     scanf("%d",&n);     for(int i=1;i<=n;i++){        sum[i]=0;ans[i]=0;E[i].clear();     }     for(int i=0;i<n-1;i++){        int a,b;scanf("%d%d",&a,&b);        E[a].push_back(b);        E[b].push_back(a);     }     dfs(1,-1);     int minn=1;     for(int i=1;i<=n;i++){        if(ans[minn]>ans[i]){            minn=i;        }     }     printf("%d %d\n",minn,ans[minn]);   }}
0 0
原创粉丝点击