博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1273 有线电视网
阅读量:7223 次
发布时间:2019-06-29

本文共 1423 字,大约阅读时间需要 4 分钟。

就是一个树形分组背包模板。然后最后在、倒叙遍历一遍根节点的dp数组就可以了

#include
#include
#include
#include
using std::max;const int maxn=3010;struct node{ int point; int weight; int nxt;};node line[maxn<<1];int head[maxn],tail;void add(int a,int b,int c){ line[++tail].point=b; line[tail].nxt=head[a]; line[tail].weight=c; head[a]=tail;}int cost[maxn];int son[maxn];int f[maxn][maxn];void dfs(int now){ bool has_son=false; f[now][0]=0; for(int i=head[now];i;i=line[i].nxt) { has_son=true; dfs(line[i].point); son[now]+=son[line[i].point]; for(int j=son[now];j>=0;j--) for(int k=0;j-k>=0&&k<=son[line[i].point];k++) f[now][j]=max(f[now][j],f[now][j-k]+f[line[i].point][k]-line[i].weight); } if(!has_son) { son[now]=1; f[now][1]=cost[now]; return ; } return ;}int main(){ memset(f,-10,sizeof(f)); int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n-m;i++) { int k,a,b; scanf("%d",&k); for(int j=1;j<=k;j++) { scanf("%d%d",&a,&b); add(i,a,b); } } for(int i=n-m+1;i<=n;i++) scanf("%d",&cost[i]); dfs(1); for(int i=son[1];i>=0;i--) { if(f[1][i]>=0) { printf("%d",i); return 0; } }}

转载于:https://www.cnblogs.com/Lance1ot/p/9372783.html

你可能感兴趣的文章
iOS开发小技巧--实现毛玻璃效果的方法
查看>>
bzoj 3529: [Sdoi2014]数表
查看>>
CF每日一练(2.11)
查看>>
operator ->
查看>>
react select
查看>>
JDBC 编程初步
查看>>
数据库SQL归纳(一)
查看>>
第9条:覆盖equals时总要覆盖hashCode
查看>>
产品经理工具
查看>>
ny495 少年 DXH
查看>>
http://www.cnblogs.com/doubleliang/tag/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/
查看>>
关于树及其各种操作
查看>>
医生问题
查看>>
Sublime Text3 配置 NodeJs 开发环境
查看>>
javascript中的对象查找
查看>>
给年轻工程师的10大忠告
查看>>
补习系列(7)-springboot 实现拦截的五种姿势
查看>>
Github网站加载不完全,响应超时,如何解决
查看>>
rem自适应布局
查看>>
django 坑~~
查看>>