宽度优先遍历(树的重心)
作者:
呆比小昱
,
2021-11-19 16:55:44
,
所有人可见
,
阅读 195
宽度优先遍历
树的重心
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 100010;
int n;
int h[N], e[N * 2], ne[N * 2], idx;
bool st[N];
int ans = N; //代表树的重心(树中连通块中点数量最大值的最小值);
//用链表实现插入操作;
void add(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
//以u为根子树的数量;
//用递归操作实现;
int dfs(int u)
{
st[u] = true;
int sum = 0, res = 0; //sum为树节点的个数,res为连通块中点数量最大值
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if(st[j]) continue;
int s = dfs(j);
res = max(s, res);
sum += s;
}
res = max(res, n - sum - 1);
ans = min(res, ans);
return sum + 1;
}
int main()
{
scanf("%d", &n);
memset(h, -1, sizeof h);
for (int i = 0; i < n - 1; i ++)
{
int a, b;
scanf("%d%d", &a, &b);
add(a, b), add(b, a); //插入的是无向边;
}
dfs(1);
printf("%d", ans);
return 0;
}
今天又学习到了新知识,芜湖!!!
继续学习继续加油!!!