3 条题解
-
0
#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
- 上传者