文章
2
粉丝
0
获赞
2
访问
158
```cpp
/**
* 我们使用DFS来计算每个节点的子树大小,
* 为了找出树的重心。
*
* 我们记录 size_subtree[u] 表示以u为根的子树大小。
*
* 删掉u之后,会形成几类连通块:
*
* 1. 以u的每个子节点v为根的子树,
* 大小为 size_subtree[v]。
*
* 2. u上面的剩余部分。
* 由于这部分仍然是一个连通块,
* 所以大小为 n - size_subtree[u]。
*
* 因此,对于每个节点u,
* 我们求删掉u之后所有连通块中最大的大小 max_part。
*
* 如果某个节点的 max_part 在所有节点中最小,
* 那么这个节点就是树的重心。
*
* 注意本体是无根树,没有指定根节点,换句话说我们要考虑无向图
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 1e5 + 5;
// g[u]中存储所有与u相邻的节点
vector<int> g[MAXN];
// size_subtree[u]表示以u为根的子树大小
int size_subtree[MAXN];
int n;
// 树的图本身是无向的,因此需要father防止DFS走回父节点
void dfs(int u, int father)
{
...
登录后发布评论
暂无评论,来抢沙发