Great Cow Gathering G
众所周知,USACO的题有几个特点。一个是翻译的题面很简洁,另一个就是写起来真的不是很复杂,想通了就可以顺利写完。
这一看就是一个换根DP的板子,和昨天写的Nearby Cows G是一样的,极其赤裸的换根。按着节奏写就对了。没什么好说的。
#include<bits/stdc++.h>
//#define zczc
#define int long long
const int N=100010;
using namespace std;
inline void read(int &wh){
wh=0;int f=1;char w=getchar();
while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar();}
wh*=f;return;
}
struct edge{
int t,v,next;
}e[N<<1];
int esum,head[N];
inline void add(int fr,int to,int val){
e[++esum]=(edge){to,val,head[fr]};head[fr]=esum;
}
int m,size[N],f[N],v[N];
void solve(int wh,int fa){
for(int i=head[wh],th;i;i=e[i].next){
if((th=e[i].t)==fa)continue;
solve(th,wh);v[th]=e[i].v;
size[wh]+=size[th];
f[wh]+=f[th]+size[th]*v[th];
}
}
void solve2(int wh,int fa){
if(fa)f[wh]+=v[wh]*(size[1]-size[wh])+f[fa]-size[wh]*v[wh]-f[wh];
for(int i=head[wh],th;i;i=e[i].next){
if((th=e[i].t)==fa)continue;
solve2(th,wh);
}
}
signed main(){
#ifdef zczc
freopen("in.txt","r",stdin);
#endif
read(m);int s1,s2,s3;
for(int i=1;i<=m;i++)read(size[i]);
for(int i=1;i<m;i++){
read(s1);read(s2);read(s3);
add(s1,s2,s3);add(s2,s1,s3);
}
solve(1,0);solve2(1,0);
int ans=1e15;
for(int i=1;i<=m;i++){
if(ans>f[i])ans=f[i];
}
printf("%lld",ans);
return 0;
}
一如既往,万事胜意