题意:一棵树,定义每个节点的balance值:去掉这点节点后的森林里所有树的最大节点数。求出最小的balance值和其所对应的节点编号。
代码:
#include<iostream>
#include<fstream>
using namespace std;
struct e{
int data;
e *next;
};
e edge[20001];
int v[20001];
int a[20001];
int b[20001];
int n;
void solve(int s){
int i,j=0,k=0;
e *p=edge[s].next;
v[s]=1;
while(p){
if(v[p->data]==0)
{
solve(p->data);
j+=b[p->data];
k=max(k,b[p->data]);
}
p=p->next;
}
b[s]=j+1;
k=max(k,n-b[s]);
a[s]=k;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t;
int cas;
cin>>cas;
while(cas--)
{
cin>>n;
for(i=1;i<=n;i++)
edge[i].next=0;
memset(v,0,sizeof(v));
for(i=1;i<n;i++)
{
cin>>s>>t;
e *p=new e;
p->data=t;
p->next=edge[s].next;
edge[s].next=p;
e *q=new e;
q->data=s;
q->next=edge[t].next;
edge[t].next=q;
}
solve(1);
int j=n+1;
for(i=1;i<=n;i++)
if(j>a[i])
{
j=a[i];
k=i;
}
cout<<k<<' '<<j<<endl;
}
}
int main(){
read();
return 0;
}