題目鏈接 DESCRIPTION INPUT 題目鏈接 DESCRIPTION INPUT INPUT INPUT OUTPUT OUTPUT SAMPLE INPUT 1 4 2 1 2 5 2 3 5 3 4 5 5 5 SAMPLE INPUT 1 4 2 1 2 5 2 3 5 3 4 5 ...
題目鏈接 DESCRIPTION
INPUT



#define OPENSTACK #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <vector> using namespace std; typedef long long LL; const int maxn=1e5+5; vector<pair<int,int> > v[maxn]; int c[maxn], cn[maxn], tmp, n; LL ans; int dfs(int p,int f) { int count=0; for(int i=0; i<v[p].size(); i++) { pair<int,int>pa=v[p][i]; if(pa.first==f) continue; int t=dfs(pa.first,p); cn[tmp]=min(t,n-t); ans+=(LL)cn[tmp]*(LL)pa.second; tmp++; count+=t; } return count+1; } int main() { #ifdef OPENSTACK long long size = 64 << 20; // 64MB char *p = (char*)malloc(size) + size; #if (defined _WIN64) or (defined __unix) __asm__("movq %0, %%rsp\n" :: "r"(p)); #else __asm__("movl %0, %%esp\n" :: "r"(p)); #endif #endif int T,k; cin>>T; while(T--) { for(int i=0;i<maxn;i++) v[i].clear(); scanf("%d%d",&n,&k); for(int i=1;i<n;i++) { int u1,u2,w; scanf("%d%d%d",&u1,&u2,&w); pair<int,int>pa1=make_pair(u1,w); pair<int,int>pa2=make_pair(u2,w); v[u1].push_back(pa2); v[u2].push_back(pa1); } for(int i=0;i<k;i++) scanf("%d",&c[i]); ans=0; tmp=0; int res=dfs(1,-1); //cout<<"點數-----"<<res<<endl; //cout<<" -----"<<ans<<endl; sort(cn,cn+tmp); sort(c,c+k); for(int i=tmp-1, j=k-1; j>=0; i--, j--) { ans+=(LL)c[j]*(LL)cn[i]; } printf("%lld\n",ans); } #ifdef OPENSTACK exit(0); #else return 0; #endif }