Codeforces Round #635 (Div. 1)A(DFS,记录子节点数量)

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 vector<int>v[200007];
 5 int vis[200007];//孩子结点数量
 6 pair<int,int>val[200007];
 7 vector<int>vv;
 8 void dfs(int x,int pre,int now){
 9     vis[x]=1;
10     for(auto it:v[x]){
11         if(it==pre)
12             continue;
13         dfs(it,x,1+now);
14         vis[x]+=vis[it];
15     }
16     vv.emplace_back(now-vis[x]+1);//当前深度减去孩子节点数量为这个结点的贡献,再加上根节点作为旅游城市(故+1)
17 }
18 int main(){
19     ios::sync_with_stdio(false);
20     cin.tie(NULL);
21     cout.tie(NULL);
22     int n,k;
23     cin>>n>>k;
24     for(int i=1;i<n;++i){
25         int x,y;
26         cin>>x>>y;
27         v[x].emplace_back(y);
28         v[y].emplace_back(x);
29     }
30     vis[1]=1;
31     dfs(1,0,0);
32     long long sum=0;
33     int mx=vv.size();
34     sort(vv.begin(),vv.end(),greater<int>());//降序排序
35     for(int i=0;i<k;++i)
36         sum+=vv[i];
37     cout<<sum;
38     return 0;
39 }

 

posted @ 2020-04-16 11:47  sewage  阅读(137)  评论(0编辑  收藏  举报