[ Luogu 1273 ] 有线电视网
\(\\\)
\(Description\)
一棵\(N\)个节点的树,编号在\([N-M+1,N]\)内的点必定为叶子节点,且这些点都有一个收益值\(Val_i\),同时每一条树边都有一个代价。
访问叶节点必须从\(1\)号点出发,经过所有必须的树边到达,每条树边的代价只计算一次。
求在总收益\(-\)总代价不为负的前提下,最多能到达多少个节点。
- \(N,K\in [1,3\times10^3]\)
\(\\\)
\(Solution\)
树形背包。设\(f[i][j]\)表示当前在\(i\)号节点,覆盖其子树内的\(j\)个节点的最大利润。
在背包的时候注意维护的\(size_i\)不再是子树大小,而是子树内有多少个编号在\([N-M+1,N]\)范围内的点。
转移为\(f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]-e[i].w)\ \big|\ j\in[0,size_u],k\in[0,size_v]\)。
初始化\(f[i][0]=0,f[i][j|j\not=0]=-inf\)。边界为\(f\bigg[i\ \big|\ i\in [N-M+1,N]\bigg]\bigg[1\bigg]=Val_i\)。
然后答案就是最大的\(i\)满足\(f[1][i]\ge 0\)。
\(\\\)
\(Code\)
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 3010
#define R register
#define gc getchar
using namespace std;
inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
}
int n,m,tot,sz[N],hd[N],val[N],f[N][N];
struct edge{int w,to,nxt;}e[N];
inline void add(int u,int v,int w){
e[++tot].to=v; e[tot].w=w;
e[tot].nxt=hd[u]; hd[u]=tot;
}
void dfs(int u,int fa){
if(u>n-m){sz[u]=1;return;}
for(R int i=hd[u],v;i;i=e[i].nxt)
if((v=e[i].to)!=fa){
dfs(v,u); sz[u]+=sz[v];
for(R int j=sz[u];j;--j)
for(R int k=sz[v];k;--k)
f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]-e[i].w);
}
}
int main(){
n=rd(); m=rd();
for(R int i=1,x;i<=n-m;++i){
x=rd();
for(R int j=1,v,w;j<=x;++j){v=rd();w=rd();add(i,v,w);}
}
for(R int i=1;i<=m;++i) val[i]=rd();
memset(f,0xcf,sizeof(f));
for(R int i=1;i<=n;++i) f[i][0]=0;
for(R int i=1;i<=m;++i) f[i+n-m][1]=val[i];
dfs(1,0);
for(R int i=m;i;--i)
if(f[1][i]>=0){printf("%d",i);return 0;}
return 0;
}
[ Luogu 1273 ] 有线电视网的更多相关文章
- Luogu 1273 有线电视网 - 树形背包
Description 树形背包, 遍历到一个节点, 枚举它的每个子节点要选择多少个用户进行转移. Code #include<cstring> #include<cstdio> ...
- Luogu P1273 有线电视网(树形dp+背包)
P1273 有线电视网 题面 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部 ...
- Luogu P1273 有线电视网
最近写DP写得比较多了 但是POJ上的题目太傻比了而且不想看英文的题面,然后就在Luogu的试炼场里找了一个DP EX专题写了一下(大概3days吧,一天一题差不多) 这是一道比较简单的DP 话说树形 ...
- 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 有线电视网
2016-05-31 13:25:45 题目链接: 洛谷 P1273 有线电视网 题目大意: 在一棵给定的带权树上取尽量多的叶子节点,使得sigma(val[选择的叶子节点])-sigma(cost[ ...
- P1273 有线电视网(树形动规,分组背包)
题目链接: https://www.luogu.org/problemnew/show/P1273 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树 ...
- 【Luogu1273】有线电视网(动态规划)
[Luogu1273]有线电视网(动态规划) 题面 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端, ...
- P1273 有线电视网
题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...
- 洛谷 P1273 【有线电视网】
题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...
随机推荐
- java web 验证码 第一次不正确的问题,解决方案
首先是form表单 ,获取图片验证码 然后使用js 去服务器验证 问题: 第一次明明输入正确 ,确验证不了??那是因为你在form表单发起请求 和 ajax 发起的请求 地址 中 一个使用127. ...
- Ubuntu 16.04设置Redis为开机自动启动服务
继上一篇文章http://www.cnblogs.com/EasonJim/p/7599941.html安装好Redis后,假设文件已经安装到/usr/local/redis目录下.假设我安装的版本为 ...
- 《Java设计模式》之状态模式
状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式同意一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它 ...
- UVa 340 Master-Mind Hints(猜数字游戏的提示)
题意 猜数字游戏 统计猜的数字有多少个数字位置正确 有多少个数字在答案中出现可是位置不对 每一个字符仅仅能匹配一次 直接匹配每位数 #include<cstdio> #includ ...
- [Spring] Properties for project configuration
We might have some project specific configuration need to setup. The good approach to do this in Spr ...
- 菜鸟运维笔记:安装与配置Apacheserver
前几天在在阿里花了49.5买了一个月的主机. 试着好用再续费吧. 地域:青岛 可用区:青岛可用区A CPU:1核 内存:512MB 带宽:1Mbps 操作系统:CentOS 6.5 64位 云盾:是 ...
- vux 全局使用 loading / toast / alert
1.入口文件 main.js import { LoadingPlugin, ToastPlugin, AlertPlugin } from 'vux' Vue.use(LoadingPlugin); ...
- 【版本号公布】Jeecg-P3 1.0 公布,J2EE微服务框架(插件开发)
JEECG-P3 1.0 公布了! JEECG-P3 1.0是一个J2EE微服务框架(插件开发). 特点:业务组件以JAR方式提供,插件模式.松耦合.可插拔.支持独立部署,也能够无缝集成Jeecg平台 ...
- ADB无法启动
一般就是5037端口被占用,各种手机助手鼓捣的 1.CMD下查看端口是否被占用 netstat -ano|findstr "5037" 截图不上了,我的是820进程,360手机助手 ...
- Jenkins重启 在Windows GUI上
To restart Jenkins manually, you can use either of the following commands: (jenkins_url)/safeRestart ...