POJ1655 Balancing Act [DFS]
题目描述
题解
找树的重心,板题
基本思路就是在DFS中枚举每一个点能否作为树的重心,并不断更新答案
代码
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 20100
using namespace std;
int Size[N],Ans,cen,n;
int End[N<<1],Last[N<<1],Next[N<<1],cnt;
void DFS(int u,int fa){
Size[u]=1;int cmp=0;
for(int i=Last[u];i;i=Next[i]){
int v=End[i];
if(v==fa)continue;
DFS(v,u);
Size[u]+=Size[v];
cmp=max(cmp,Size[v]);
}
cmp=max(cmp,n-Size[u]);
if(cmp<Ans || (cmp==Ans && u<cen))Ans=cmp,cen=u;
}
void Ins(int x,int y){
End[++cnt]=y,Next[cnt]=Last[x],Last[x]=cnt;
}
void Init(){
memset(Next,0,sizeof(Next));
memset(Last,0,sizeof(Last));
cnt=0,Ans=1e9;
}
int main(){
int T;scanf("%d",&T);
while(T--){
Init();
scanf("%d",&n);
for(int i=1;i<n;i++){
int u,v;scanf("%d%d",&u,&v);
Ins(u,v),Ins(v,u);
}
DFS(1,0);
printf("%d %d\n",cen,Ans);
}
return 0;
}