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爱心蜗牛【树形动规】
爱心蜗牛 猫猫把嘴伸进池子里,正准备"吸"鱼吃,却听到门铃响了.猫猫擦了擦脸上的水,打开门一看,那人正是她的好朋友--川川.川川手里拿着一辆玩具汽车,对猫猫说:"这是我的 ...
随机推荐
- 设置RAC DB归档
1.关闭集群数据库 srvctl stop database -d RAC 2.将节点一设置为归档模式 sqlplus / as sysdba startup mount alter database ...
- Docker部署FastDFS(附示例代码)
1. FastDFS简介 FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文 ...
- Java JVM——2.类加载器子系统
概述 类加载器子系统在Java JVM中的位置 类加载器子系统的具体实现 类加载器子系统的作用 ① 负责从文件系统或者网络中加载.class文件,Class 文件在文件开头有特定的文件标识. ② Cl ...
- Angular *ngIf length
Angular *ngIf length 在Angular中如何判断*ngIf Arrary的长度? 具体代码如下: result = []; <div class="kt-secti ...
- Promise对象,究竟为何物?
Promise对象 一.什么是Promise? Promise是一种异步操作的解决方案,将写法复杂的传统的回调函数和监听事件的异步操作,用同步代码的形式表达出来. Promise避免了多级异步操作的回 ...
- SVN 使用教程 命令 visual studio 使用SVN
首先推荐大家一个应该是国内外最好的SVN仓库,不限私有,不限成员:https://svnbucket.com/ SVN官网 https://tortoisesvn.net/downloads.html ...
- win7激活不支持的启动引导分区完美解决方法
前言: 激活win7显示不支持的启动引导分区怎么办?有用户使用暴风激活工具给win7 64位系统激活时,弹出Error提示框"不支持的启动引导分区". 这是因为传统的win7激活工 ...
- [UWP] - 修改应用程序在任务栏上的显示Logo
用VS2015在windows 10上开发一个UWP的应用,由于windows 10对store应用进行了窗口化,因此可以看到在任务栏上看到应用程序的图标,但是看起来会感觉应用Logo会被嵌在另一个容 ...
- PPT技术干货1(上)——设计审美
序言 PPT直接反映了一个人的能力和态度,PPT能直接反映出老板最看重的4个关键能力: 逻辑思维:全局思考,洞察关键 数据思维:数据分析,指导决策 设计思维:美观大方,彰显专业 工作效率:效率高,出活 ...
- 最全的Visual Studio Code配置及使用教程
史上最全vscode配置使用教程 工欲善其事,必先利其器.想要优雅且高效的编写代码,必须熟练使用一款前端开发工具.但前端开发工具数不胜数,像HBuilder.Sublime Text.WebStorm ...