【题解】Luogu P3942 将军令 贪心

f[x][0] 表示最近控制驿站的距离

f[x][1]表示最远不能控制的驿站距离

当f[x][0]+f[x][1]≤k是说明能被控制,但没有贡献

当f[x][1]=k时,x必须被控制,这时已经到达能控制点的最远距离,如果再向上,x就无法被控制

正确性:如果x可以向上移动,并且仍然能控制x移动前能控制的点,就把x向上移动,这样不会变差的

code

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 namespace gengyf{
 4 #define ll long long
 5 const int maxn=1e5+10;
 6 const int inf=1e9+7;
 7 inline int read(){
 8     int x=0,f=1;
 9     char c=getchar();
10     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
11     while(c>='0'&&c<='9'){x=(x*10)+c-'0';c=getchar();}
12     return x*f;
13 }
14 int n,k,t,ans;
15 struct edge{
16     int nxt,to;
17 }e[maxn*2];
18 int head[maxn],cnt,f[maxn][2];
19 inline void add(int from,int to){
20     e[++cnt].to=to;e[cnt].nxt=head[from];head[from]=cnt;
21 }
22 void dfs(int x,int fa){
23     f[x][0]=inf;f[x][1]=0;
24     for(int i=head[x];i;i=e[i].nxt){
25         int y=e[i].to;
26         if(y==fa)continue;
27         dfs(y,x);
28         if(~f[y][1]){
29             f[x][1]=max(f[x][1],f[y][1]+1);
30         }
31         f[x][0]=min(f[x][0],f[y][0]+1);
32     }
33     if(f[x][1]==k){
34         ans++;
35         f[x][0]=0;f[x][1]=-1;
36     }
37     if(f[x][1]+f[x][0]<=k)f[x][1]=-1;
38 }
39 int main(){
40     n=read();k=read();t=read();
41     for(int i=1;i<n;i++){
42         int x,y;x=read();y=read();
43         add(x,y);add(y,x);
44     }
45     dfs(1,0);
46     if(~f[1][1])ans++;
47     printf("%d",ans);
48     return 0;
49 }
50 }
51 signed main(){
52   gengyf::main();
53   return 0;
54 }
View Code

 

posted @ 2019-09-27 16:49  喵の耳  阅读(135)  评论(0编辑  收藏  举报