求调,只有十分,不知为何,感觉思路没有问题
查看原帖
求调,只有十分,不知为何,感觉思路没有问题
910357
songzhihan2010楼主2024/1/13 14:32
#include<bits/stdc++.h>
using namespace std;
int n;
const int N=1e5+10;
int c[N];
int sum=0;
int ans;
vector<pair<int,int> > edge[N];
int f[N],dis[N],size[N],g[N];
void dfs(int t,int fa){
	size[t]=c[t];
	dis[t]+=dis[fa];
	g[t]=c[t]*dis[t];
	for (int i=0;i<edge[t].size();i++){
		if(edge[t][i].first!=fa){
			dis[edge[t][i].first]=edge[t][i].second;
			dfs(edge[t][i].first,t);
			size[t]+=size[edge[t][i].first];
		}
	}
}
void dfs1(int t,int fa){
	for (int i=0;i<edge[t].size();i++){
		if(edge[t][i].first!=fa){
			f[edge[t][i].first]=f[t]-sum*(dis[edge[t][i].first]-dis[t])+2*size[edge[t][i].first]*(dis[edge[t][i].first]-dis[t]);
			ans=min(ans,f[edge[t][i].first]);
			dfs1(edge[t][i].first,t);
		}
	}
}
int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		scanf("%d",&c[i]);
		sum+=c[i];
	}
	for (int i=1;i<n;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		edge[u].push_back(make_pair(v,w));
		edge[v].push_back(make_pair(u,w));
	}
	g[1]=0;
	dis[1]=0;
	dfs(1,0);
	for (int i=1;i<=n;i++){
		f[1]+=g[i];
//		cout<<g[i]<<" "<<dis[i]<<endl;
	}
	ans=f[1];
	dfs1(1,0);
//	for (int i=1;i<=n;i++) cout<<f[i]<<" ";
	cout<<ans;
}
2024/1/13 14:32
加载中...