社区讨论
求调,调对必关
P2015二叉苹果树参与者 4已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mj6qu598
- 此快照首次捕获于
- 2025/12/15 13:59 2 个月前
- 此快照最后确认于
- 2025/12/18 17:30 2 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5;
using ll = long long;
ll n, q, u, v, p, w, f[N][N], z[N], p1, p2, w1, w2, cs, ans;
struct node{
ll u, w;
};
vector <node> a[N];
void sd(ll x, ll u){
for(auto it : a[x]){
if(it.u == u){
continue;
}
sd(it.u, x);
z[x] += z[it.u] + 1;
}
}
void dfs(ll x, ll u){
f[x][0] = 0;
for(int k = 1; k <= q; k++){
f[x][k] = -1e18;
}
if(a[x].size() <= 1){
return;
}
cs = 0;
p1 = 0, p2 = 0, w1 = 0, w2 = 0;
for(auto it : a[x]){
if(it.u == u){
continue;
}
dfs(it.u, x);
if(cs == 0){
p1 = it.u;
w1 = it.w;
}else{
p2 = it.u;
w2 = it.w;
}
cs = !cs;
}
if(p2 == 0){
return;
}
for(int i = 0; i <= min(q, z[p1] + 1); i++){
for(int j = 0; j <= min(q - i, z[p2] + 1); j++){
int k = i + j;
if(k > q){
continue;
}
ans = 0;
if(i > 0){
ans += w1;
ans += f[p1][i - 1];
}
if(j > 0){
ans += w2;
ans += f[p2][j - 1];
}
f[x][k] = max(f[x][k], ans);
}
}
}
int main(){
cin >> n >> q;
for(int i = 1; i < n; i++){
cin >> u >> v >> w;
a[u].push_back({v, w});
a[v].push_back({u, w});
}
sd(1, 0);
dfs(1, 0);
cout << f[1][q];
return 0;
}
CPP11 7
10 3 5
1 9 3
1 8 1
2 11 5
3 2 1
3 7 34
2 4 5
8 10 25
8 6 20
10 5 1
这个样例中正确输出91,代码输出106
回复
共 6 条回复,欢迎继续交流。
正在加载回复...