P3942 将军令

自己造的一组hack数据打错一个数字,自闭—— 凸(艹皿艹 )

本质是一个贪心,策略是建边,以任意底为根,排最深的点再贪它。

预处理深度,遍历顺序。寻找覆盖最远的点,自下向上不到必须不选,子树向上覆盖。

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int read(){
 4     int a=1,b=0;char t;
 5     while(t<'0'||t>'9'){
 6         if(t=='-') a=-1;
 7         t=getchar();
 8     }
 9     while(t>='0'&&t<='9') b=b*10+t-'0',t=getchar();
10     return a*b;
11 }
12 #define maxn 100010
13 #define F(i,a,b) for(int i=a;i<=b;i++)
14 
15 int n,k,ans,tot;
16 /*
17 struct edge{
18     int to,nxt;
19 }ea[maxn];
20 
21 int dfs(int u,int fa){
22     int v,minm=0,maxm=0;
23     for(int i=head[u];i;i=ea[i].nxt){
24         v=dfs(ea[i].to,u);
25         if(ea[i].to!=fa){
26             if(v<0) minm=min(minm,v);
27             else maxm=max(maxm,v);
28         }
29     }
30     if(maxm>-minm) return maxm-1;
31     if(-minm==k||u==1) return ++ans,k;
32     return minm-1;
33 }*/
34 struct edge{
35     int v;
36     edge *nxt;
37 } pool[maxn<<1],*tp=pool,*head[maxn];
38 int dfs(int x,int fa){
39     int t,mn=0,mx=0;
40     for (edge *i=head[x];i;i=i->nxt)
41         if (i->v!=fa)
42             (t=dfs(i->v,x))<0? mn=min(mn,t):mx=max(mx,t);
43     if(mx>-mn) return mx-1;
44     if(-mn==k||x==1) return ++ans,k;
45     return mn-1;
46 }
47 int main(){
48     n=read(),k=read(),read();
49     F(i,1,n-1){
50         int u=read(),v=read();/*
51         ea[++tot].nxt=head[u],head[u]=tot,ea[tot].to=v;
52         ea[++tot].nxt=head[v],head[v]=tot,ea[tot].to=u;*/
53         *tp=(edge){v,head[u]},head[u]=tp++;
54         *tp=(edge){u,head[v]},head[v]=tp++;
55     }
56     dfs(1,0);
57     cout<<ans;
58 }
View Code

 

posted @ 2019-07-26 21:30  admire◢◤  阅读(184)  评论(0编辑  收藏  举报