Great Cow Gathering G

link

众所周知,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;
}
posted @ 2022-06-21 16:44  Feyn618  阅读(22)  评论(0编辑  收藏  举报