紫书上的方法树的很明确,这里列举了一道例题,还有对这种类型的题目更高深的一些问题。
首先,是poj-1655的一道裸题,也是入门类型的。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n;
vector<int> son[20010];
int val[20010];
int sum[20010];
void dfs(int z,int fa)
{
int d = son[z].size();
for(int i=0; i<d; i++)
{
int p = son[z][i];
if(p != fa)
{
dfs(p,z);
sum[z] += sum[p]+1;
val[z] = max(val[z], sum[p]+1);
}
}
val[z] = max(val[z], n-sum[z]-1);
return ;
}
int main()
{
int t;
cin >> t;
while(t--)
{
int k,l;
cin >> n;
for(int i=1; i<n; i++)
{
cin >> k >> l;
son[k].push_back(l);
son[l].push_back(k);
}
dfs(1,0);
int a=1;
int b=val[1];
for(int i=2; i<=n; i++)
{
int cc =val[i];
if(cc < b)
{
b = cc; a = i;
}
}
cout << a << " " << b << endl;
memset(val, 0, sizeof(val));
memset(sum, 0, sizeof(sum));
for(int i=1; i<=n; i++) son[i].clear();
}
return 0;
}
然后,这里看到了一些大佬的博客,总结了很多树的重心的性质,很精辟。
给出网址,感觉自己的水平还差得远呢。