码迷,mamicode.com
首页 > 其他好文 > 详细

CF 1042F Leaf Sets

时间:2018-10-30 00:19:00      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:nbsp   mes   print   using   ack   tin   div   push   algorithm   

 

贪心题

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

之后就是代码实现了

 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 }

 

CF 1042F Leaf Sets

标签:nbsp   mes   print   using   ack   tin   div   push   algorithm   

原文地址:https://www.cnblogs.com/lnxcj/p/9874007.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!