CF 1042F Leaf Sets

 

贪心题

易证,在保证当前元素数量的前提下使一个大集合中的最长边最小时显然是最优情况

之后就是代码实现了

 1 #include<vector>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,m,cnt,tot,rt;
 7 int fa[1000005];
 8 int head[1000005];
 9 int dgr[1000005];
10 struct Edge{
11     int fr;
12     int to;
13     int nxt;
14 }edge[2000005];
15 void addedge(int f,int t){
16     cnt++;
17     edge[cnt].fr=f;
18     edge[cnt].to=t;
19     edge[cnt].nxt=head[f];
20     head[f]=cnt;
21 }
22 int dfs(int u){
23     if(dgr[u]==1)return 1;
24     vector<int>tr;
25     for(int i=head[u];i;i=edge[i].nxt){
26         int v=edge[i].to;
27         if(v==fa[u])continue;
28         fa[v]=u;
29         int tmp=dfs(v);
30         tr.push_back(tmp);
31     }
32     int siz=tr.size();int i;
33     sort(tr.begin(),tr.end());
34     for(i=siz-1;i>=1;i--){
35         if(tr[i]+tr[i-1]<=m)break;
36         tot++;
37     }
38     return tr[i]+1;
39 }
40 int main(){
41     scanf("%d%d",&n,&m);
42     for(int i=1;i<n;i++){
43         int u,v;
44         scanf("%d%d",&u,&v);
45         addedge(u,v);
46         addedge(v,u);
47         dgr[u]++,dgr[v]++;
48         if(dgr[u]>1)rt=u;
49         if(dgr[v]>1)rt=v;
50     }
51     dfs(rt);
52     printf("%d\n",tot+1);
53     return 0;
54 }

 

转载于:https://www.cnblogs.com/lnxcj/p/9874007.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值