#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; // 邻接表表示图 vector<int> adj[n + 1]; // 输入边 for (int i = 1; i < n; ++i) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } // 输入权值 vector<int> W(n + 1); for (int i = 1; i <= n; ++i) { cin >> W[i]; } int max_product = 0; // 最大联合权值 long long total_sum = 0; // 所有联合权值的总和 // 遍历每个节点k for (int k = 1; k <= n; ++k) { // 遍历k的所有邻居u for (int i = 0; i < adj[k].size(); ++i) { int u = adj[k][i]; // 遍历k的所有邻居v(v > u,避免重复计算) for (int j = i + 1; j < adj[k].size(); ++j) { int v = adj[k][j]; int product = W[u] * W[v]; if (product > max_product) { max_product = product; } total_sum += product; } } } // 由于(u,v)和(v,u)是两种不同的有序点对,总和需要乘以2 total_sum *= 2; cout << max_product << " " << total_sum << endl; return 0; } /************************************************************** Problem: 2335 User: admin Language: C++ Result: Time Limit Exceed ****************************************************************/