树的重心

你必须非常努力,才能看起来毫不费力。

今天才学到了这个,代码看了好久,又去看了别人的文章,才真正的理解了树的重心。

什么是树的重心?

树的重心也叫树的质心。找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。

我自己的解释:树的重心就是对于某一个树的结点i来说,暂且将它当作树根。它可能有好几个树枝,找出每一个树枝最多的结点,记做d[i]。找出每一个结点j的d[j],最小那一个就是要的重心。

树的重心有什么性质呢?

  1. 树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个距离和,他们的距离和一样。

  2. 把两棵树通过一条边相连,新的树的重心在原来两棵树重心的连线上。

  3. 一棵树添加或者删除一个节点,树的重心最多只移动一条边的位置。

  4. 一棵树最多有两个重心,且相邻

 

然后放上一道题目

链接:https://www.nowcoder.com/acm/contest/214/A
来源:牛客网
 

题目描述

有一天clccle和rqy走在某个国家的街头上,机智的rqy却发现周围的行人不太对劲,他们嘴里念念有词,说着"sqn tql!",一边漫无目的的行走,clccle也发现了这一点,却惊讶的发觉这种奇怪的病毒会向周围的城市,最终会感染整个国家,因为网络已经崩溃,所以她们忘记了自己所在的城市,她们唯一知道的是这种病毒是从当前她们所在的城市开始传播的,并且这个国家的所有城市到这个城市的距离和最小(所有道路的距离都为1),现在给定聪明的你一张整个国家的地图,请你帮rqy和clccle找到她们现在可能在这个国家的哪一个城市.

输入描述:

两个整数n,m,代表这个国家一共有n个城市,城市之间只有m条道路

接下来m行,每行两个整数a,b代表城市a,b之间有一条联通的道路

输出描述:

多个整数,输出当前clccle和rqy可能所在的点

 

示例1

输入

复制

2 1
1 2

输出

复制

1 2

备注:

对于所有的数据,1<=m<=n<=50000

(图的类型保证没有大小大于等于3的环)

这个题其实就是给你一棵树,然后输出重心,我是从小到大输出,m=n-1(因为我就是把他当作一棵树搞得)。。。。 

 

//真的是豁然开朗
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define ll long long
#define INF 0x3f3f3f
using namespace std;
const int maxn=50000+5;
int d[maxn];//dp[i]表示的是第i个结点的子结点的个数,包括该结点
int minbalance;//通过比较记录结点子树结点最大   中   最小 //这个理解比较重要,可以继续看代码 
vector a[maxn];//a[i]表示的就是第i个结点,然后里面存储的是和它链接点的序号 
int n,m;
int cnt;//记录的有几个结果 
int result[5];//用来记录最终的结果,因为可能不只是一个结果满足条件 

void dfs(int node,int parent)
{
	d[node]=1;//the node itself
	int i,j;
	int maxsubtree=0;
	for(i=0;i> n >> m;
	int u,v,i,j;
	for(i=0;i

 

你可能感兴趣的:(树,乱七八糟)