abc_E只过了4个点求调
  • 板块学术版
  • 楼主1CR_wait_ME
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/4/6 22:19
  • 上次更新2024/4/7 13:51:24
查看原帖
abc_E只过了4个点求调
893971
1CR_wait_ME楼主2024/4/6 22:19
#include <iostream>
#include <vector>
#define ll long long
using namespace std;

const int N = 1e5 + 10;

int n;
vector<int> G[N];
int c[N];

ll sum[N];
ll ss, ans = -1;

ll sumtree(int node, int pre){
	for (int i = 0; i<G[node].size(); i++){
		if (G[node][i] == pre) continue;
		sum[node] += sumtree(G[node][i], node);
	}
	sum[node] += (ll)c[node];
	return sum[node];
}

void dfs1(int node, int pre, int depth){
	ss += depth * (ll)c[node];
	for (int i = 0; i<G[node].size(); i++){
		if (G[node][i] == pre) continue;
		dfs1(G[node][i], node, depth + 1);
	}
}

void dfs2(int node, int pre, int flast){
	ll fnow = flast + sum[1] - 2 * sum[node];
	if (ans == -1 || fnow < ans){
		ans = fnow;
	}
	for (int i = 0; i<G[node].size(); i++){
		if (G[node][i] == pre) continue;
		dfs2(G[node][i], node, fnow);
	}
}

int main(){
	cin >> n;
	for (int i = 1; i<n; i++){
		int a, b;
		cin >> a >> b;
		G[a].push_back(b);
		G[b].push_back(a);
	}
	for (int i = 1; i<=n; i++){
		cin >> c[i];
	}
	sumtree(1, -1);
	dfs1(1, -1, 0);
	for (int i = 0; i<G[1].size(); i++){
		dfs2(G[1][i], 1, ss);
	}
	cout << ans << endl;
	return 0;
}
2024/4/6 22:19
加载中...