| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 9241 | Accepted: 3846 |
Description

Input
Output
Sample Input
1 7 2 6 1 2 1 4 4 5 3 7 3 1
Sample Output
1 2
Source
求树的重心。
任意选一个点为root,进行dfs,找到最大儿子最小的那个结点即可。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int tot=0,ans1,n,ans2,h[20005],T,son[20005];
struct edge
{
int y,ne;
}a[100005];
void Addedge(int x,int y) //前向星也挺好写的,以后不用vector了
{
tot++;
a[tot].y=y;
a[tot].ne=h[x];
h[x]=tot;
}
void Dfs(int x)
{
int i=h[x],now=0;
son[x]=0;
while (i)
{
int y=a[i].y;
if (son[y]==-1)
{
Dfs(y);
son[x]=son[x]+son[y]+1;
if (son[y]+1>now) now=son[y]+1;
}
i=a[i].ne;
}
if (now<n-1-son[x]) now=n-1-son[x];
if (now==ans1&&ans2>x) ans2=x;
if (now<ans1)
ans1=now,ans2=x;
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
tot=0;
for (int i=1;i<=n;i++)
h[i]=0;
for (int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
Addedge(x,y);
Addedge(y,x);
}
for (int i=1;i<=n;i++)
son[i]=-1;
ans1=ans2=n;
Dfs(1);
printf("%d %d\n",ans2,ans1);
}
return 0;
}
【POJ 1655】Balancing Act 【树的重心】
原文地址:http://blog.csdn.net/regina8023/article/details/41961583