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 }