POJ 1655 树的重心

gx巨巨的题意:

此题要求我们求一棵树的重心。

给定一棵N个结点的树,求该树的所有重心。重心的定义如下:

删掉某结点i后,若剩余k个连通分量,那么定义d(i)为这些连通分量中结点数的最大值。

所谓重心,就是使得d(i)最小的结点i

算法分析:

建图;

树的基本操作:以结点1为根,计算出每个结点所在的子树的结点数。

枚举每一个结点,若将其删掉,那么考虑剩余的所有连通分量。

1、它的子树,其结点数可以直接调用。

2、它的上方子树,其结点数可通过n-1-减去所有子树的结点数算出。

这样,在其中选择d(i)最小的即可。时间复杂度:O(N),空间复杂度:O(N)

 

相当于树形dp

#include
#include
#include
#include
using namespace std;
inline int Max(int a,int b){return a>b?a:b;}
inline int Min(int a,int b){return a dp[i])
		  {
			  minnum = dp[i];
			  pos = i;
		  }

	  printf("%d %d\n", pos, minnum);
  }
  return 0;
}


 

你可能感兴趣的:(树的重心,树形DP,水题)