dfs深度优先遍历-求树的重心
重点
- 树的搜索需要去重数组st
- dfs(u)表示从节点u向下进行搜索,节点u一定是合法的,并求得节点u的相关信息。而之前的dfs求排列数中dfs(u)表示对u这一位进行搜索,实际上,表示的是从上一个节点状态(排列状态)向下搜索,搜索的数字位置是u,且这一位置不一定是合法的。
深搜题需要明确哪些点
- 搜索树上的节点表示对是什么,他们的节点状态如何表示
- dfs函数表示的是什么意思
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010, M = N * 2;
int h[N], e[M], ne[M], cnt;
int n;
bool st[N];
int ans = N;
void add(int a, int b) {
e[cnt] = b, ne[cnt] = h[a], h[a] = cnt++;
}
int dfs(int u) {
st[u] = true;
int res = 0, sum = 1;
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() {
cin >> 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); // 表示当前要搜索的是哪一个具体的节点
cout << ans << endl;
return 0;
}