社区讨论

求调,调对必关

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;
}

CPP
11 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 条回复,欢迎继续交流。

正在加载回复...