树的重心 poj-1655

紫书上的方法树的很明确,这里列举了一道例题,还有对这种类型的题目更高深的一些问题。

首先,是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;
}
然后,这里看到了一些大佬的博客,总结了很多树的重心的性质,很精辟。


给出网址,感觉自己的水平还差得远呢。

点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值