树的重心
树的重心的定义:
去掉这个点后,剩下的子树中节点最多的那棵树,的节点最少,那么这棵树,就是树的重心
const int N = 2e5 + 10;
int e[N], ne[N], h[N], len;
int n, ans, cnt[N];
bool vis[N];
int pos;
void dfs(int u)
{
vis[u] = true, cnt[u] = 1; //子树x的大小
int max_part = 0; //去调x以后 子树中最大的大小
for (int i = h[u]; ~i; i = ne[i])
{
int y = e[i];
if (vis[y])
continue;
dfs(y);
cnt[u] += cnt[y];
max_part = max(max_part, cnt[y]);
}
max_part = max(max_part, n - cnt[u]);
if (ans > max_part)
{
ans = max_part;//重心对应的子树的最大值
pos = u; //重心所在的位置
}
return;
}
连通图的划分
void dfs(int x){
vis[x] = cnt;
{
for (int i = h[x]; ~i; i = ne[i])
{
int y = e[i];
if (vis[y])
continue;
dfs(y);
}
}
int main()
{
for (int i = 1; i <= n; i++)
{
if (!vis[i])
{
cnt++;
dfs(i);
}
}
return 0;
}
来源:CSDN
作者:正月看雪花
链接:https://blog.csdn.net/qq_45432665/article/details/104396867