换根dp,为什么错了
查看原帖
换根dp,为什么错了
298402
cccyyylll888楼主2022/5/3 11:55
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
long long c[1000005];
long long dp[1000005];
long long sz[1000005];
long long ans[1000005];
bool vis[1000005];
struct road{
	int r;
	int l;
};
vector<road> t[1000005];
void dfs(int x)
{
	vis[x] = 1;
	sz[x] = c[x];
	for(int i = 0;i < t[x].size();i++)
	{
		int v = t[x][i].r;
		if(!vis[v])
		{
			dfs(v);
			sz[x] += sz[v];
			dp[x] = dp[x] + dp[v] + sz[v] * t[x][i].l;
		}
	}
}
void down(int x)
{
	vis[x] = 1;
	for(int i = 0;i < t[x].size();i++)
	{
		int v = t[x][i].r;
		if(!vis[v])
		{
			ans[v] = dp[v] + ans[x] - dp[v] - sz[v] * t[x][i].l + t[x][i].l * (n - sz[v]);
			dfs(v);
		}	
	}
}
int main()
{
	cin >> n;
	for(int i = 1;i <= n;i++)
	cin >> c[i];
	for(int i = 1;i <= n-1;i++)
	{
		int a,b,m;
		cin >> a >> b >> m;
		road q;
		q.r = b;
		q.l = m;
		t[a].push_back(q);
		q.r = a;
		t[b].push_back(q);
	}
	vis[1] = 1;
	dfs(1);
	ans[1] = dp[1];
	memset(vis,0,sizeof(vis));
	vis[1] = 1;
	down(1);
	long long minn = 0;
	for(int i = 1;i <= n;i++)
	{
		minn = min(minn,ans[i]);
	}
	cout << minn;
	return 0;
} 
2022/5/3 11:55
加载中...