hdu 6060 RXD and dividing

思路:判断子树节点个数和k的最小值就好了,long long 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=1e6+10;
 5 
 6 int n,k;
 7 vector<pair<int ,ll > > e[N];
 8 ll sum;
 9 int a[N];
10 void dfs(int u,int fa){
11     a[u]=1;
12     for(int i=0;i<e[u].size();i++){
13         int v=e[u][i].first;
14         if(v==fa) continue;
15         dfs(v,u);
16         a[u]+=a[v];
17     }
18         for(int i=0;i<e[u].size();i++){
19             int v=e[u][i].first;
20             if(v==fa) continue;
21          //   cout<<e[u][i].second<<" "<<min(a[u]-1,k)<<" "<<u<<endl;
22             sum+=min(a[v],k)*e[u][i].second;
23         }
24 
25 }
26 int main(){
27     while(scanf("%d%d",&n,&k)!=EOF){
28         for(int i=1;i<=n;i++) e[i].clear();
29         memset(a,0,sizeof(a));
30         int x,y,z;
31         sum=0;
32         for(int i=1;i<n;i++){
33             scanf("%d%d%d",&x,&y,&z);
34             e[x].push_back(make_pair(y,z));
35             e[y].push_back(make_pair(x,z));
36         }
37         dfs(1,0);
38         cout<<sum<<endl;
39     }
40 }
原文地址:https://www.cnblogs.com/hhxj/p/7269982.html