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

 

转载于:https://www.cnblogs.com/btcadmire123A/p/11253021.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值