CF 1042F Leaf Sets
Posted lnxcj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ",tot+1); 53 return 0; 54 }
以上是关于CF 1042F Leaf Sets的主要内容,如果未能解决你的问题,请参考以下文章