只能过样例求调
查看原帖
只能过样例求调
856633
hzr6767楼主2025/7/2 16:23
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
vector<int>e[N];
int w[N];//记录点权
int n;
int ans = 0;
int maxx = 0;
void dfs(int u, int fa) {
	int sum = 0;
	int m1 = 0, m2 = 0; //寻找该节点子节点的最大的两个节点的权值
	for (auto v : e[u]) {
		if (v == fa)continue;
		if (w[v] > m1) {//m1最大,m2次之
			m2 = m1;
			m1 = w[v];
		}
		ans += (sum * w[v] * 2); //记录兄弟节点之间的联合权值
		sum += w[v];
		//下面记录爷孙节点情况
		ans += w[fa] * w[v] * 2;
		dfs(v, u);
		maxx = max(maxx,max(m1*m2,m1*w[fa]));//寻找联合权值最大值
	}
	return ;
}
signed main() {
	cin >> n;
	int u, v;
	for (int i = 1; i < n; i++) {
		cin >> u >> v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	for (int i = 1; i <= n; i++)cin >> w[i];
	dfs(1, 0);
	cout <<maxx <<" "<< (ans+10007)%10007 << "\n";
	return 0;
}
2025/7/2 16:23
加载中...