题意:给一个森林,n个节点,每个点有点权,问若从中刚好选择m个点(选择某点之前必须先选择了其父亲),使得这m个点权之和最大为多少?

思路:

  比较常规。就是DFS一次,枚举在子树中可能选择的k个点(注意上限为min(子树节点数,到此子树最多可选节点数)),需要注意的是dp[t][1]必须是点t自己,枚举的时候必须先选择t才能选择t的孩子。但是本题是森林,那么可以建1个虚拟根编号为0(根输入一模一样),然后虚拟根的权为0即可,而所要选的数就变成m+1了。

 #include <bits/stdc++.h>
#define pii pair<int,int>
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=; struct node
{
int from,to,val,next;
node(){};
node(int from,int to,int val,int next):from(from),to(to),val(val),next(next){};
}edge[N];
int head[N], n, edge_cnt;
void add_node(int from,int to,int val)
{
edge[edge_cnt]=node(from, to, val, head[from]);
head[from]=edge_cnt++;
} int dp[N][N];
int DFS(int t,int m,int val)
{
if(m==) return ; //点数上限了。
dp[t][]=val; //只能挑1个点时,必须挑自己
node e;
int sum=;
for(int i=head[t]; i!=-&&m>; i=e.next)
{
e=edge[i];
int tmp=DFS(e.to, m-, e.val); //最多可以在e.to子树中选多少个点
sum+=tmp; for(int j=sum; j>; j--)
for(int k=; k<=tmp&& k<j; k++) //保证j-k>=1,因为t是必选的
if(dp[t][j-k]>=)
dp[t][j]=max(dp[t][j], dp[t][j-k]+dp[e.to][k]);
}
return sum; //返回在本子树中可以选的点数上限
} int main()
{
//freopen("input.txt", "r", stdin);
int a,b,m;
while(scanf("%d%d",&n,&m),n+m)
{
memset(head, -, sizeof(head));
memset(dp, -, sizeof(dp));
edge_cnt=; for(int i=; i<=n; i++)
{
scanf("%d%d",&a,&b);
add_node(a,i,b);
}
DFS(, m+, ); //0是虚拟根
printf("%d\n", dp[][m+]);
}
return ;
}

AC代码

最新文章

  1. 2017 年值得一瞥的 JavaScript 相关技术趋势
  2. 关于使用struts2时子窗体页面跳转后在父窗体打开的问题以及Session过期后的页面跳转问题
  3. Linux命令:简单函数调用
  4. Xcode 8 : iOS xib is missing from working copy、iOS misssing file
  5. 解决JSON.stringify()在IE10下无法使用的问题
  6. fill 函数
  7. gdb经常使用的命令
  8. iOS 开发 旧版 framework
  9. 【AIM Tech Round 4 (Div. 2) D Prob】
  10. Windows10配置JDK环境变量
  11. openwrt 编译
  12. 烽火R2600交换机配置脚本
  13. highchart在IE8下面的显示问题解决
  14. Java反射《四》获取方法
  15. (转载)关于java多线程web服务器 以及相关资料转载
  16. 使用Xutils 3 中遇到的一些问题!!!!
  17. 【转】vs2010打开qt的.pro文件时错误解决办法
  18. 一个web.Config或app.Config自定义段configSections的示例
  19. swift - 封装 GCDTimer 和 NSTimer
  20. ListView 中 的 分页

热门文章

  1. C语言--递归问题
  2. 理解复杂的const和typedef和指针的关系
  3. Python3.6列表函数&amp;方法
  4. 洛谷 - P2257 - YY的GCD - 莫比乌斯反演 - 整除分块
  5. meta标签常用属性
  6. 渲染路径-实时渲染中常用的几种Rendering Path
  7. [Xcode 实际操作]九、实用进阶-(29)为App添加IAP(支付方式)内购项目
  8. 新建Podfile命令
  9. C - Catch That Cow POJ - 3278
  10. 测试 | 单元测试工具 | JUnit