ProgramAlgTrain/20240919/CSP常考算法模板/树上问题_dfs.cpp

55 lines
1.1 KiB
C++
Raw Normal View History

2024-09-19 02:22:41 +00:00
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
//dep[u]<5D><><EFBFBD><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//leaf[u]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><75><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD><C7B3><EFBFBD>Ǹ<EFBFBD>Ҷ<EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>
int n , m , rt , leaf[MAXN] , dep[MAXN];
vector<int> graph[MAXN];
// <20><><EFBFBD><EFBFBD>dep[u]<5D><>leaf[u]
int dfs(int u, int fa) { // <20><><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
dep[u] = dep[fa] + 1;
// u<><75>Ҷ<EFBFBD>ӽڵ<D3BD>
if(graph[u].size()==1) {
leaf[u] = dep[u];
return leaf[u];
}
for(int v : graph[u]) {
if(v == fa) continue;
leaf[u] = min(dfs(v , u) , leaf[u]);
}
return leaf[u];
}
// <20>ڵ<EFBFBD>u<EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>farmer<65><72><EFBFBD><EFBFBD>
int dfs2(int u, int fa) {
if(dep[u] - 1 >= leaf[u] - dep[u]) return 1;
int cnt = 0;
for (int v : graph[u]) {
if (v == fa) continue;
cnt += dfs2(v, u);
}
return cnt;
}
int main() {
// freopen("atlarge.in", "r", stdin);
// freopen("atlarge.out", "w", stdout);
memset(leaf , 0x3f , sizeof(leaf));
scanf("%d%d" , &n, &rt);
for(int i = 0; i < n - 1 ; i++) {
int u, v;
scanf("%d%d" , &u , &v);
graph[u].push_back(v);
graph[v].push_back(u);
}
dfs(rt , 0);
printf("%d\n" , dfs2(rt, 0));
return 0;
}