我可以给你大概画一个示意图,你需要吗
7 个赞
人才
5 个赞
看不懂
3 个赞
行,谢大佬
4 个赞
我本来,是想用暴力,样例能过,但是0分
4 个赞
没事儿
4 个赞
你没发现你提交错了吗
我说的是第二题
5 个赞
啊对啊
4 个赞
现在第二题对了吗
5 个赞
A了
4 个赞
我的
4 个赞
第一题怎么样了
5 个赞
努力
4 个赞
嗯,谢大佬
4 个赞
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105;
vector<int> adj[MAXN];
int w[MAXN];
int dp[MAXN][MAXN];
void dfs(int u, int parent) {
dp[u][1] = w[u];
for (int v : adj[u]) {
if (v == parent) continue;
dfs(v, u);
for (int j = MAXN - 1; j >= 1; --j) {
if (dp[u][j] != -1) {
for (int k = 1; k <= MAXN - 1; ++k) {
if (dp[v][k] != -1) {
int new_dist = dp[u][j] + dp[v][k] + k * j;
dp[u][j + k] = (dp[u][j + k] == -1) ? new_dist : min(dp[u][j + k], new_dist);
}
}
}
}
}
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> w[i];
}
for (int i = 1; i <= n; ++i) {
adj[i].clear();
}
for (int i = 1; i <= n - 1; ++i) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
memset(dp, -1, sizeof(dp));
dfs(1, -1);
int min_dist = INT_MAX;
for (int i = 1; i <= n; ++i) {
if (dp[i][1] != -1) {
min_dist = min(min_dist, dp[i][1]);
}
}
cout << min_dist << endl;
return 0;
}
0分
4 个赞
?你看懂我发的图了吗
7 个赞
你这是啥?
3 个赞