P1273 有线电视网(树形动规,分组背包)
题目链接:
https://www.luogu.org/problemnew/show/P1273
题目描述
某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。
从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费用总和。
现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定给哪些用户提供信号而不给哪些用户提供信号。
写一个程序找出一个方案使得有线电视网在不亏本的情况下使观看转播的用户尽可能多。
输入输出格式
输入格式:
输入文件的第一行包含两个用空格隔开的整数N和M,其中2≤N≤3000,1≤M≤N-1,N为整个有线电视网的结点总数,M为用户终端的数量。
第一个转播站即树的根结点编号为1,其他的转播站编号为2到N-M,用户终端编号为N-M+1到N。
接下来的N-M行每行表示—个转播站的数据,第i+1行表示第i个转播站的数据,其格式如下:
K A1 C1 A2 C2 … Ak Ck
K表示该转播站下接K个结点(转播站或用户),每个结点对应一对整数A与C,A表示结点编号,C表示从当前转播站传输信号到结点A的费用。最后一行依次表示所有用户为观看比赛而准备支付的钱数。
输出格式:
输出文件仅一行,包含一个整数,表示上述问题所要求的最大用户数。
输入输出样例
输入样例#1: 复制
5 3
2 2 2 5 3
2 3 2 4 3
3 4 2
输出样例#1: 复制
2
思路:
节点与节点之间具有先后的依赖关系,在本题中表现为只有先选择中转接点才能访问到叶子节点。
以题目给定的样例为例,如果要访问3,4节点必须先经过2,在这里假设f[u][j]为节点为u时选择前j个节点获得的最大利润,以f[1][j]来说,他最多可以选择的节点分别是3,4,5三个节点,但是3,4这两个节点必须先经过2。那么f[1][j]可以表示成:$f[1][j]=max(f[1][j],f[1][j-k]+f[son][k]-edge[1][son])$,其中k表示1的前k个节点,edge[1][son]表示节点1和他的孩子之间的边。这里可以看成是节点1选择k个孩子,但这k个孩子是由下一层节点回溯上来的。
每一个中转节点相当于一个大的背包,中转节点的孩子相当于背包里面的商品,如果背包容量为k,那么可以在这里背包里面选择1~k个商品。然后中转节点在向上层节点回溯,最后汇聚到根节点。
初始化每个节点为负无穷大,最后根据根节点f[1][j]来判断可以有多少孩子满足条件。
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
vector<pair<int,int> > ed[3005];
int n,m;
int v[3005];
int f[3005][3005];
int dfs(int u){
// printf("%d\n",u);
if(u>n-m){
f[u][1]=v[u];
return 1;
} int sum=0;
for(auto to:ed[u]){
int nxt=to.first,d=to.second;
int t=dfs(nxt);
sum+=t; for(int j=sum;j>0;j--){
for(int i=1;i<=t;i++){
if(j-i>=0)
f[u][j]=max(f[u][j],f[u][j-i]+f[nxt][i]-d);
}
}
} return sum;
}
int main(){ scanf("%d %d",&n,&m);
for(int i=1;i<=n-m;i++){
int k;
scanf("%d",&k);
while(k--){
int nd,w;
scanf("%d %d",&nd,&w);
ed[i].pb(mp(nd,w));
}
}
for(int i=n-m+1;i<=n;i++) scanf("%d",&v[i]);// memset(f,-0x3f3f3f3f,sizeof(f));
fill(f[0],f[0]+3005*3005,-0x3f3f3f3f);
for(int i=1;i<=n;i++) f[i][0]=0; dfs(1);
for(int j=m;j>0;j--){
if(f[1][j]>=0){
printf("%d\n",j);
break;
}
}
return 0;
}
P1273 有线电视网(树形动规,分组背包)的更多相关文章
- Luogu P1273 有线电视网(树形dp+背包)
P1273 有线电视网 题面 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部 ...
- P1273 有线电视网(树形dp)
P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. ...
- Luogu P1273 有线电视网 树形DP
又重构了一下...当然当初的题一看就看懂了QAQ 设f[i][j]表示以i为根的子树,有j个客户的最大收益 方程:f[u][j+k]=max(f[u][j+k],f[u][j]+f[v][k]-w(u ...
- 洛谷P1273 有线电视网 (树上分组背包)
洛谷P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节 ...
- 洛谷 P1273 有线电视网(树形背包)
洛谷 P1273 有线电视网(树形背包) 干透一道题 题面:洛谷 P1273 本质就是个背包.这道题dp有点奇怪,最终答案并不是dp值,而是最后遍历寻找那个合法且最优的\(i\)作为答案.dp值存的是 ...
- 洛谷P1273 有线电视网 树上分组背包DP
P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 ...
- 洛谷——P1273 有线电视网
P1273 有线电视网 题目大意: 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树 ...
- 洛谷 P1273 有线电视网
2016-05-31 13:25:45 题目链接: 洛谷 P1273 有线电视网 题目大意: 在一棵给定的带权树上取尽量多的叶子节点,使得sigma(val[选择的叶子节点])-sigma(cost[ ...
- C++ 洛谷 P1273 有线电视网 题解
P1273 有线电视网 很明显,这是一道树形DP(图都画出来了,还不明显吗?) 未做完,持续更新中…… #include<cstdio> #include<cstring> ...
- XJOI1571爱心蜗牛【树形动规】
爱心蜗牛 猫猫把嘴伸进池子里,正准备"吸"鱼吃,却听到门铃响了.猫猫擦了擦脸上的水,打开门一看,那人正是她的好朋友--川川.川川手里拿着一辆玩具汽车,对猫猫说:"这是我的 ...
随机推荐
- 主从复制架构直接转换MGR(manual)
环境信息 IP port role info 192.168.188.81 3316 node1 master 192.168.188.82 3316 node2 slave1 192.168.188 ...
- Unity 操作快捷键
Q Hand(手形)工具 可以平移整个Scene视图 W Translate(移动)工具 移动所选择的游戏对象 E Rotate(旋转)工具 按任意角度旋转游戏 ...
- .NET Core集成CorrelationId实现全链路日志输出
.NET Core集成CorrelationId实现全链路日志输出 一,链路追踪 随着微服务架构的流行,一次请求会涉及多个服务的调用,并且服务本身也可能会依赖其他服务,整个请求路径会构成一个调用链,当 ...
- Spark SQL 小文件问题处理
在生产中,无论是通过SQL语句或者Scala/Java等代码的方式使用Spark SQL处理数据,在Spark SQL写数据时,往往会遇到生成的小文件过多的问题,而管理这些大量的小文件,是一件非常头疼 ...
- Spring Cloud Alibaba基础教程-Nacos(二)
在Spring Cloud Alibaba基础教程-Nacos(一)当中学习了,如何从 nacos当中 通过Java的方式获取值,以及连接数据库,下面我们开始第二篇的学习 ,如果对你有帮助,方便下次寻 ...
- 第一天——编程语言与python
------------恢复内容开始------------ what's the python? python是一门编程语言,编程语言就是人用来和计算机沟通的语言,语言就是人与人,人与事物进行沟通的 ...
- Elasticsearch 学习二(请求流程).
一.写入数据 1.ES 的任意节点都可以作为协调(Coordinating)节点接受请求(包括新建.索引或者删除请求),每个节点都知道集群中任一文档位置: 2.协调节点会通过 routing 字段计算 ...
- DotfuscatorPro防止反编译&ILSpy反编译
DotfuscatorPro_4.9可以防止你的.NET软件被反编译,可以在一定程度上防止你的软件被反编译.现在很多软件都有被反编译的现象,虽然不能做到百分百的防范,但是你至少可以先做些技术上的处理, ...
- Oracle dd-m月-yy转yyyy-mm-dd
表名称:TEST_LP 字段:PROD_DATE 1 SELECT '20' || SUBSTR(T.PROD_DATE, INSTR(T.PROD_DATE, '-', 1, 2) + 1, 2) ...
- Zookeeper笔记分享
Zookeeper采用zap协议来保证数据的一致性 常见的数据一致性协议采用raft协议 参数解读: tickTime=2000:心跳包发送间隔时长 initLimit=10:leader与fol ...