社区讨论

38分求调

P2015二叉苹果树参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjs6vta
此快照首次捕获于
2025/11/04 07:38
4 个月前
此快照最后确认于
2025/11/04 07:38
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
struct e{
    int v,w;
};
struct node{
    int father;
    vector<e>son;
}tree[150];
int n,q,dp[150][150],cnt[150];
void dfs(int root){
    int son1=0,son2=0,son1w=0,son2w=0;
    for(int i=0;i<tree[root].son.size();++i){
        e son=tree[root].son[i];
        dfs(son.v);
        if(son1){
            son2=son.v;
            son2w=son.w;
        }else{
            son1=son.v;
            son1w=son.w;
        }
        cnt[root]+=cnt[son.v]+1;
    }
    //printf("%d %d %d %d\n",son1,son1w,son2,son2w);
    if(son1==0&&son2==0)return;
    for(int i=0;i<=cnt[root];++i){
    	for(int l=0;l<=i;++l){
	        int x=0,y=0,r=i-l;
	        if(l>0)x=son1w+dp[son1][l-1];
	        if(r>0)y=son2w+dp[son2][r-1];
	        dp[root][l+r]=max(dp[root][l+r],x+y);
	    }
	}
}
int main(){
    tree[1].father=1;
    scanf("%d%d",&n,&q);
    for(int i=1;i<n;++i){
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        if(tree[u].father){
            tree[v].father=u;
            tree[u].son.push_back((e){v,w});
        }else{
            tree[u].father=v;
            tree[v].son.push_back((e){u,w});
        }
    }
    dfs(1);
    //for(int i=1;i<=n;++i)printf("%d\n",cnt[i]);
    /*
    for(int i=1;i<=n;++i){
        for(int j=0;j<=cnt[i];++j)printf("%d ",dp[i][j]);
        printf("\n");
    }
    */
    printf("%d",dp[1][q]);
}

回复

0 条回复,欢迎继续交流。

正在加载回复...