T第六个点求助!悬关!
查看原帖
T第六个点求助!悬关!
398047
取名真难!楼主2024/5/21 20:34
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime> 
#include<stack>
#include<queue>
#include<map>
#define ull unsigned long long
using namespace std;
long long n,a,b,d,c[200005],lc[400005];
long long ans;
long long cnt,head[200005];
long long ji[400005];
struct node{
	long long to,net,dis;
}bian[400005];
void add(long long x,long long y,long long z){
	cnt++;
	bian[cnt].to=y;
	bian[cnt].net=head[x];
	head[x]=cnt;
	bian[cnt].dis=z;
}
void init(long long now,long long fa,long long lu){
	if(lc[lu]!=0&&lu!=0){
		return;
	}
	for(int i=head[now];i;i=bian[i].net){
		if(i==0) continue;
		if(bian[i].to!=fa){
			init(bian[i].to,now,i);
			lc[lu]+=lc[i];
		}
	}
	lc[lu]+=c[now];
}
long long dfs(long long now,long long fa,long long lu){
	if(lu&&ji[lu]) return ji[lu];
	long long sum=0;
	for(int i=head[now];i;i=bian[i].net){
		if(i==0) continue;
		long long y=bian[i].to;
		long long z=bian[i].dis;
		if(y!=fa){
			sum+=dfs(y,now,i);
			sum+=lc[i]*z;
		}
	}
	ji[lu]=sum;
	return sum;
}
int main(){
//	freopen("num.in","r",stdin);
//	freopen("num.out","w",stdout); 
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>c[i];
	}
	for(int i=1;i<n;i++){
		cin>>a>>b>>d;
		add(a,b,d);
		add(b,a,d);
	}
	for(long long i=1;i<=n;i++) init(i,i,0);
	for(long long i=1;i<=n;i++){
		long long minn=dfs(i,i,0);
		if(i!=1) ans=min(ans,minn);
		else ans=minn;
	}
	cout<<ans;
//	fclose(stdin);
//	fclose(stdout); 
	return 0;
}
/*

*/
2024/5/21 20:34
加载中...