第三场。。大量的数学题。。最咸鱼的一次。。纠结于1003却忽视了这道水题;
就是题目难理解一点
求出所有子树的大小与k比较,然后用小的乘上权值求和就行
#include<bits/stdc++.h>
using namespace std;
struct node
{
int v,w;
};
node temp;
vector<node> vec[1000005];
int Size[1000005];
int w[1000005];
void dfs(int u,int pre){
Size[u]=1;
int len=vec[u].size();
for(int i=0;i<len;i++){
int v=vec[u][i].v;
if(v!=pre){
w[v]=vec[u][i].w;
dfs(v,u);
Size[u]+=Size[v];
}
}
}
int main(){
int n,k;
while(~scanf("%d%d",&n,&k)){
for(int i=1;i<=n;i++){
vec[i].clear();
Size[i]=0;
w[i]=0;
}
for(int i=1;i<=n-1;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
temp.v=v;
temp.w=w;
vec[u].push_back(temp);
temp.v=u;
vec[v].push_back(temp);
}
dfs(1,0);
long long sum=0;
for(int i=2;i<=n;i++){
sum+=(long long)w[i]*min(Size[i],k);
}
printf("%lld\n",sum);
}
return 0;
}