$$\color{red}{算法}\color{blue}{基础课}\color{purple}{笔记and题解}\color{green}{汇总}$$
笔记:
学会$DFS$搜索图。
学会处理重复搜索($flag$数组)。
该题$dfs(u)$返回的是以$u$为根的子树中节点数量。
从除了这个树的剩余连通块和这个树的子树搜索答案。
$dfs$同时统计答案即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 100010, M = N * 2;
int n, m;
int h[N], e[M], ne[M], idx;
bool st[N];
int ans = N;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int dfs(int u) { //以u为根的子树中节点的数量
st[u] = 1;
int sum = 1, res = 0;
for (int i = h[u]; ~i; i = ne[i]) {
int j = e[i];
if (!st[j]) {
int s = dfs(j);
res = max(res, s);
sum += s;
}
}
res = max(res, n - sum);
ans = min(ans, res);
return sum;
}
int main() {
scanf("%d", &n);
memset(h, -1, sizeof h);
for (int i = 0; i < n - 1; i++) {
int a, b; cin>>a>>b;
add(a, b); add(b, a);
}
dfs(1);
printf("%d\n", ans);
return 0;
}
为什么这里
n 要 -1 啊,不减1也能过啊
读入问题,和算法无关,自己琢磨