您的位置:首页 > 其它

[PKU1655]Balancing Act

2013-11-25 21:13 393 查看
找树的重心,树的分治基础题

DFS时找到去掉这点后每个联通分量的点数的最大值并更新ans,最后输出ans即可

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int> g[20010];
int T,a[20010],n,ans,anst;
int find(int now,int fa)
{
int maxt=0,sum=0;
for (int i=0;i<(int)g[now].size();i++)
if (g[now][i]!=fa)
{
int t=find(g[now][i],now);
maxt=max(maxt,t);
sum+=t;
}
maxt=max(maxt,n-sum-1);
if (maxt<ans)
{
anst=now;
ans=maxt;
}
return(sum+1);
}
int main()
{
scanf("%d",&T);
for (int Ti=1;Ti<=T;Ti++)
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
g[i].clear();
memset(a,0,sizeof(a));
int s,t;
for (int i=1;i<=n-1;i++)
{
scanf("%d%d",&s,&t);
g[s].push_back(t);
g[t].push_back(s);
}
ans=99999999;
t=find(1,0);
printf("%d %d\n",anst,ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DFS 分治