【链接】:
https://codeforces.com/problemset/problem/1029/E
【题意】:
用最少的连1的边使得树上每个点到1的距离不超过2
【分析】:
离1最远的点需要连边的需求越大,从叶子节点考虑,肯定是父亲连边比叶子节点连边更优。父亲连边,改变父亲的父亲的距离,重复操作。在树形dp递归的过程中完成。
【代码】:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 200005;
vector<int>v[maxn];
int dis[maxn];
int ans = 0;void dfs(int cur, int pre, int cnt) {dis[cur] = cnt;int flag = 0;for (int y : v[cur]) {if (y == pre)continue;dfs(y, cur, cnt + 1);if (dis[y] > 2) {flag = 1;dis[cur] = 1;dis[pre] = 2;}}if (flag)ans++;
}int main() {int n;scanf("%d", &n);n--;while (n--) {int x, y;scanf("%d%d", &x, &y);v[x].push_back(y);v[y].push_back(x);}dfs(1, -1 ,0);printf("%d\n", ans);
}