3 条题解

  • 0
    @ 2023-8-8 14:41:52
    #include<bits/stdc++.h>
    #include<cstring>
    #include<queue>
    #include<set>
    #include<stack>
    #include<vector>
    #define ll long long
    using namespace std;
    const int N=1e5+10;
    const int M=500;
    const int inf=0x3f3f3f3f;
    struct node
    {
    	int data;//数据部分 
    	int to;//指向的节点 
    };
    vector<node> vc[N];//v[i]表示第i条链表
    int n,q,u,v,w; 
    int dp[M][M],son[N];
    //dp[i][j]表示以 为根节点  有j个节点时的最优解
    void dfs(int u,int fa)
    {
    	son[u]=1;//计算当前节点的儿子数量
    	dp[u][1]=0;
    	//每局当前节点的相连边
    	for(int i=0;i<vc[u].size();i++)
    	{
    		int v=vc[u][i].to;//当前节点相连的点
    		if(v==fa)continue;//如果相连的点是他的爹 continue
    		dfs(v,u);//遍历儿子
    		son[u]+=son[v];//儿子数量
    		//枚举当前爹节点的儿子数量
    		for(int j=son[u];j>=1;j--)
    		{
    			for(int k=1;k<=min(j-1,son[v]);k++)//当前儿子的节点数 
    			{
    				dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]+vc[u][i].data);
    			}
    		 } 
    	 } 
     } 
    int main()
    {
    	cin>>n>>q;
    	memset(dp,-inf,sizeof dp);
    	for(int i=1;i<=n-1;i++)
    	{
    		cin>>u>>v>>w;
    		vc[u].push_back(node{w,v});
    		vc[v].push_back(node{w,u});
    	}
    	dfs(1,0);
    	cout<<dp[1][q+1];
    	return 0;
    }
    
    

    树状dp

    信息

    ID
    472
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    123
    已通过
    41
    上传者