H - Holiday's Accommodation ICPC 思维
连接:https://vjudge.net/contest/400668#problem/H
思路:对于每一条边,求 min(左边点的个数,右边点的个数)*边的权值*2
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+10; 4 typedef long long ll; 5 ll ans; 6 struct node 7 { 8 int v,w,nxt; 9 }G[2*maxn]; 10 int head[maxn];int num; 11 int siz[maxn]; 12 int n; 13 void add(int u,int v,int w) 14 { 15 G[++num].v=v;G[num].w=w;G[num].nxt=head[u];head[u]=num; 16 } 17 void init() 18 { 19 memset(head,0,sizeof(head)); 20 memset(siz,0,sizeof(siz)); 21 num=0; 22 ans=0; 23 } 24 void dfs(int u,int fa) 25 { 26 siz[u]=1; 27 for(int i=head[u];i;i=G[i].nxt){ 28 int v=G[i].v; 29 if(v==fa) continue; 30 dfs(v,u); 31 ans+=min(siz[v],n-siz[v])*2*G[i].w; 32 siz[u]+=siz[v]; 33 } 34 } 35 int main() 36 { 37 int T; 38 scanf("%d",&T); 39 int Case=0; 40 while(T--){ 41 init(); 42 scanf("%d",&n); 43 for(int i=1;i<n;i++){ 44 int u,v,w; 45 scanf("%d%d%d",&u,&v,&w); 46 add(u,v,w); 47 add(v,u,w); 48 } 49 dfs(1,0); 50 printf("Case #%d: %lld\n",++Case,ans); 51 } 52 return 0; 53 }