Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8095 | Accepted: 3341 |
Description
For example, consider the tree:
Deleting node 4 yields two trees whose member nodes are {5} and {1,2,3,6,7}. The larger of these two trees has five nodes, thus the balance of node 4 is five. Deleting node 1 yields a forest of three trees of equal size: {2,6}, {3,7}, and {4,5}. Each of these trees has two nodes, so the balance of node 1 is two.
For each input tree, calculate the node that has the minimum balance. If multiple nodes have equal balance, output the one with the lowest number.
Input
Output
Sample Input
1 7 2 6 1 2 1 4 4 5 3 7 3 1
Sample Output
1 2
Source
#include<stdio.h>
#include<string.h>
#define MAXN 20008
struct edge{
int to,next;
}p[MAXN*2];
int head[MAXN],son[MAXN],all,n,res1,res2;
int MAX(int x,int y){ return x>y?x:y; }
int MIN(int x,int y){ return x<y?x:y; }
void add(int x,int y)
{
p[all].to=y;
p[all].next=head[x];
head[x]=all++;
}
void dfs(int x,int f)
{
int res=0,i;
for(i=head[x];i!=-1;i=p[i].next)
{
if(p[i].to==f) continue;
dfs(p[i].to,x);
res=MAX(res,son[p[i].to]);
son[x]+=son[p[i].to];
}
son[x]++;
res=MAX(res,n-son[x]);
if(res<res2||(res==res2&&x<res1)) res1=x,res2=res;
}
int main()
{
int t,i,x,y;
scanf("%d",&t);
while(t--)
{
memset(head,-1,sizeof(head));
memset(son,0,sizeof(son));
scanf("%d",&n);
for(all=0,i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y); add(y,x);
}
res1=res2=1000000;
dfs(1,-1);
printf("%d %d\n",res1,res2);
}
return 0;
}