大佬求调
查看原帖
大佬求调
1152177
Kuromi0212楼主2024/6/9 22:06
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
long long n,c[maxn],f[maxn],size[maxn],h[maxn],g[maxn],sum,cnt;
struct road{
	int a;
	int b;
	int l; 
}r[maxn*2];
void add(int a,int b,int l){
	r[++cnt].a=b;
	r[cnt].l=l;
	r[cnt].b=h[a];
	h[a]=cnt;
}
void dfs1(int u,int fa){
	int v=0;
	size[u]=c[u];
	for(int i=h[u];i;i=r[i].b){
		v=r[i].a;
		if(v==fa){
			continue;
		}
		dfs1(v,u);
		size[u]+=size[v];
		f[u]+=f[v]+size[v]*r[i].l;
	}
}
void dfs2(int u,int fa){
	int v=0;
	for(int i=h[u];i;i=r[i].b){
		v=r[i].a;
		if(v!=fa){
			continue;
		}
		g[u]=f[v]-f[u]-(size[u]*r[i].l)+g[v]+(sum-size[u])*r[i].l;
		for(int i=h[u];i;i=r[i].b){
			if(r[i].a!=fa){
				dfs2(r[i].a,u);
			}
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>c[i];
		sum+=c[i];
	}
	int a1,b1,l1;
	for(int i=1;i<n;i++){
		cin>>a1>>b1>>l1;
		add(a1,b1,l1);
		add(b1,a1,l1);
	}
	dfs1(1,0);
	dfs2(1,0);
	long long ans=0x3f;
	for(int i=1;i<=n;i++){
		ans=min(ans,f[i]+g[i]);
	}
	cout<<ans;
}
2024/6/9 22:06
加载中...