有大佬有遇到这种毒瘤问题吗,4个对了,3个MLE,3个RE
查看原帖
有大佬有遇到这种毒瘤问题吗,4个对了,3个MLE,3个RE
306094
AMXY楼主2022/7/10 14:44

求大佬指点一下

#include<bits/stdc++.h>
using namespace std;

vector<int> e[100001];

int f[100001], v[100001], q, n, sum, num, size[100001], ff[100001], c[100001], w[10001][10001];

void dfs(int x, int fa) {
	size[x] = c[x];
	for(int i = 0; i < e[x].size(); i ++) {
		int son = e[x][i];
		if(son == fa) 
			continue;
		dfs(son, x);
		size[x] += size[son];
	}
}

void dfs1(int x, int fa) {
	for(int i = 0; i < e[x].size(); i ++) {
		int son = e[x][i];
		if(son == fa) 
			continue;
		ff[son] = ff[x] + w[son][x];
		dfs1(son, x);
	}
	sum += ff[x] * c[x];
}

void dp(int x, int fa) {
	for(int i = 0; i < e[x].size(); i ++) {
		int son = e[x][i];
		if(son == fa) 
			continue;
		v[son] = 1;
		f[son] = f[x] + (num - 2 * size[son]) * w[son][x];
		dp(son, x);
	}
}

int main() {
	cin >> n;
	memset(f, 0X7f, sizeof(f));
	for(int i = 1; i <= n; i ++) {
		cin >> c[i];
		num += c[i];
	}
	for(int i = 1; i < n; i ++) {
		int a, b, c;
		cin >> a >> b >> c;
		e[a].push_back(b);
		e[b].push_back(a);
		w[a][b] = c;
		w[b][a] = c;
	}
	dfs(1, -1);
	dfs1(1, -1);
	f[1] = sum;
	dp(1, -1);
	int ans = sum, ans1;
	for(int i = 1; i <= n; i ++) 
		ans = min(ans, f[i]);
	cout << ans << endl;
	return 0;
}
2022/7/10 14:44
加载中...