将军令
10.24
思路:
其实就是BZOJ 1117 救火站Gas 的简单版,其实就是O(n)的,哪里来的k!!!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#define LL long long
#define N 5000010
using namespace std;
int req[N], has[N];
int ans, idc=0;
int n, opt, k;
int head[N];
inline int read(){
int x = 0, f = 1; char ch = getchar();
while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9'){ x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
struct Edge{
int to, nxt;
}ed[N << 1];
inline void adde(int u, int v){
ed[++idc].to = v;
ed[idc].nxt = head[u];
head[u] = idc;
}
inline void dfs(int u, int fa){
for(int i=head[u]; i; i=ed[i].nxt) {
int v = ed[i].to;
if(v == fa) continue;
dfs(v, u);
req[u] = max(req[u], req[v] + 1);//req[u]表示u为root的子树中还没被覆盖的点中距离最大多少
has[u] = max(has[u], has[v] - 1);//has[u]表示u为root的子树中可覆盖的点中距离最大多少
}
req[u] = max(req[u], 0);//-1表示没有
if(has[u] >= req[u]) req[u] = -1;
if(req[u] == k){
has[u] = k;
req[u] = -1;
ans++;
}
}
int main() {
freopen ("general.in", "r", stdin);
freopen ("general.out", "w", stdout);
scanf("%d%d%d", &n, &k, &opt);
memset(req, -1, sizeof(req));
memset(has, -1, sizeof(has));
for(register int i=1; i<n; i++){
int u = read(), v = read();
adde(u, v); adde(v, u);
}
dfs(1, 0);
if(has[1] >= req[1]) req[1] = -1;
if( req[1] != -1 ) ans++;
printf("%d\n", ans);
return 0;
}