55 lines
1.2 KiB
C++
55 lines
1.2 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
|
||
const int MAXN = 1e5 + 5;
|
||
|
||
//dep[u]代表u的深度
|
||
//leaf[u]代表以u为根的子树中,深度最浅的那个叶子节点的深度。
|
||
int n , m , rt , leaf[MAXN] , dep[MAXN];
|
||
|
||
vector<int> graph[MAXN];
|
||
|
||
// 算出dep[u]和leaf[u]
|
||
int dfs(int u, int fa) { // 返回距离u点最近的叶子节点深度
|
||
dep[u] = dep[fa] + 1;
|
||
// u是叶子节点
|
||
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];
|
||
}
|
||
|
||
// 节点u能够被控制所需的farmer数量
|
||
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;
|
||
}
|