文章

2

粉丝

0

获赞

2

访问

158

头像
树的重心 题解:
P10094 fdu_2025年保研机试题
发布于2026年9月1日 11:53
阅读数 96

```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)

{

    ...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发