1. 程式人生 > >CF 1042F Leaf Sets

CF 1042F Leaf Sets

cstring size ack amp code -- scanf struct 代碼

貪心題

易證,在保證當前元素數量的前提下使一個大集合中的最長邊最小時顯然是最優情況

之後就是代碼實現了

 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