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 }

 

posted @ 2018-10-29 23:14  Mr_Handsome  阅读(132)  评论(0编辑  收藏  举报