P1273 有线电视网 【洛谷算法习题】

发布时间:2026/10/19 2:10:03

P1273 有线电视网 【洛谷算法习题】 P1273 有线电视网网页链接添加链接描述题目描述某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构这棵树的根结点位于足球比赛的现场树叶为各个用户终端其他中转站为该树的内部节点。从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的一场转播的总费用等于传输信号的费用总和。现在每个用户都准备了一笔费用想观看这场精彩的足球比赛有线电视网有权决定给哪些用户提供信号而不给哪些用户提供信号。写一个程序找出一个方案使得有线电视网在不亏本的情况下使观看转播的用户尽可能多。输入格式输入文件的第一行包含两个用空格隔开的整数N NN和M MM其中2 ≤ N ≤ 3000 2 \le N \le 30002≤N≤30001 ≤ M ≤ N − 1 1 \le M \le N-11≤M≤N−1N NN为整个有线电视网的结点总数M MM为用户终端的数量。第一个转播站即树的根结点编号为1 11其他的转播站编号为2 22到N − M N-MN−M用户终端编号为N − M 1 N-M1N−M1到N NN。接下来的N − M N-MN−M行每行表示—个转播站的数据第i 1 i1i1行表示第i ii个转播站的数据其格式如下K A 1 C 1 A 2 C 2 … A k C k K \ \ A_1 \ \ C_1 \ \ A_2 \ \ C_2 \ \ \ldots \ \ A_k \ \ C_kKA1​C1​A2​C2​…Ak​Ck​K KK表示该转播站下接K KK个结点转播站或用户每个结点对应一对整数A AA与C CCA AA表示结点编号C CC表示从当前转播站传输信号到结点A AA的费用。最后一行依次表示所有用户为观看比赛而准备支付的钱数。单次传输成本和用户愿意交的费用均不超过10 1010。输出格式输出文件仅一行包含一个整数表示上述问题所要求的最大用户数。输入输出样例 #1输入 #15 3 2 2 2 5 3 2 3 2 4 3 3 4 2输出 #12输入输出样例 #2输入 #25 3 2 2 2 5 3 2 3 2 4 3 4 4 2输出 #23输入输出样例 #3输入 #39 6 3 2 2 3 2 9 3 2 4 2 5 2 3 6 2 7 2 8 2 4 3 3 3 1 1输出 #35说明/提示样例解释如图所示共有五个结点。结点 ① 为根结点即现场直播站② 为一个中转站③④⑤ 为用户端共M MM个编号从N − M 1 N-M1N−M1到N NN他们为观看比赛分别准备的钱数为3 33、4 44、2 22。从结点 ① 可以传送信号到结点 ②费用为2 22也可以传送信号到结点 ⑤费用为3 33第二行数据所示从结点 ② 可以传输信号到结点 ③费用为2 22也可传输信号到结点 ④费用为3 33第三行数据所示。如果要让所有用户③④⑤都能看上比赛则信号传输的总费用为2 3 2 3 10 232310232310大于用户愿意支付的总费用3 4 2 9 34293429有线电视网就亏本了而只让 ③④ 两个用户看比赛就不亏本了。解题思路本题是树形依赖背包的经典问题。有线电视网是一棵以 1 为根的树叶子节点是用户终端每个用户愿意支付一定费用而每条边有传输成本。需要选择性地向部分用户传输信号使得在不亏本总收益 ≥ 总成本的前提下观看的用户数量最多。1. 问题等价转化将每个用户愿意支付的费用视为正收益每条边的传输费用视为负成本。对于每个节点u uu若选择向其子树中的某些用户传输信号则必须支付从u uu到这些用户的路径上的所有边成本并累加这些用户支付的费用。目标在根节点 1 处选择一个用户集合使得总利润用户支付总额 − 边成本总额≥ 0且用户数量最大。定义f[u][j]表示以u uu为根的子树中选择j jj个用户时能获得的最大利润。最终答案是最大的j jj使得f[1][j] 0。2. 动态规划设计节点分类若u uu是用户终端u N − M u N-MuN−M则f[u][1] 用户支付费用f[u][0] 0。若u uu是转播站则需要合并其所有子节点的背包结果。转移方程对于转播站u uu初始f[u][0] 0其余为负无穷。遍历每个子节点v vv边成本为w ww将v vv的背包合并到u uuf [ u ] [ j ] max ⁡ k 0 j ( f [ u ] [ j − k ] f [ v ] [ k ] − w ) f[u][j] \max_{k0}^{j} \big( f[u][j-k] f[v][k] - w \big)f[u][j]k0maxj​(f[u][j−k]f[v][k]−w)其中k kk是从子节点v vv中选择的用户数减去边成本w ww是因为选择v vv子树中任何用户都必须支付这条边的费用。边界对于用户终端f[u][1] 支付费用对于转播站初始只有f[u][0] 0。3. 算法实现代码思路解析代码采用了一种后序遍历 一维背包合并的写法建图读入每个转播站的下接节点及边成本用邻接表存储。同时将边成本记为子节点的负收益c[v] -w。对于用户终端读入其支付费用并累加到c[u]。DFS 后序遍历从根节点 1 开始 DFS计算每个节点的子树大小sz[u]并将节点按后序顺序存入数组idx即先处理完所有子节点再处理父节点。动态规划使用f[i][j]表示处理到后序数组第i ii个节点时选择j jj个用户的最大利润。对于第i ii个节点u uu若u uu是用户终端f[i][j] max(f[i-1][j-1] c[u], f[i-1][j])选择或不选择该用户。若u uu是转播站f[i][j] max(f[i-1][j] c[u], f[i-sz[u]][j])。这里f[i-1][j] c[u]表示将u uu的收益即连接到父节点的边成本负值计入并继承之前的状态f[i-sz[u]][j]表示跳过整个u uu的子树因为后序中u uu的子树是连续的sz[u]是子树大小。这种写法将树形背包压缩为一维后序序列上的 0/1 背包避免了显式的子树合并循环。答案从m mm到 0 遍历找到第一个满足f[tot][i] 0的i ii即为最多可观看的用户数。4. 复杂度分析时间复杂度DFS 遍历O ( N ) O(N)O(N)。动态规划部分对于每个节点u uu枚举用户数j jj从 1 到m mm总状态数O ( N × M ) O(N \times M)O(N×M)。N ≤ 3000 N \le 3000N≤3000M ≤ N − 1 M \le N-1M≤N−1最坏约9 × 10 6 9 \times 10^69×106次操作完全可行。空间复杂度需要存储邻接表、DP 数组f[N][M]、后序数组等O ( N × M ) O(N \times M)O(N×M)约9 × 10 6 9 \times 10^69×106个long long在 256M 限制内。总结本题是树形依赖背包的典型应用。通过后序遍历将树结构展开为序列并利用子树在序列中连续的性质将树形背包转化为一维序列上的背包问题简化了状态转移。最终在根节点处寻找利润非负的最大用户数。该方法巧妙且高效适合本题的数据规模。代码内容#includebits/stdc.husingnamespacestd;#defineendl\ntypedeflonglongll;typedefunsignedlonglongull;typedefvectorvectorllvvt;typedefpairll,llpll;constll N3010;constll INF1e9;constll M1e610;constll mod1e97;structnode{ll to,nxt;}e[N];ll n,m,cnt,head[N],c[N];voidadd(ll u,ll v){e[cnt].tov;e[cnt].nxthead[u];head[u]cnt;}ll f[N][N],idx[N],sz[N],tot;voiddfs(ll u){sz[u]1;for(ll ihead[u];i;ie[i].nxt){ll ve[i].to;dfs(v);sz[u]sz[v];}idx[tot]u;}intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);scanf(%lld%lld,n,m);for(ll u1;un-m;u){ll k;scanf(%lld,k);for(ll j1;jk;j){ll v;scanf(%lld,v);ll w;scanf(%lld,w);c[v]-w;add(u,v);}}for(ll un-m1;un;u){ll x;scanf(%lld,x);c[u]x;}dfs(1);for(ll i0;itot;i)for(ll j1;jm;j)f[i][j]-INF;for(ll i1;itot;i){ll uidx[i];for(ll j1;jm;j){if(n-m1u)f[i][j]max(f[i-1][j-1]c[u],f[i-1][j]);elsef[i][j]max(f[i-1][j]c[u],f[i-sz[u]][j]);}}for(ll im;i0;i--){if(f[tot][i]0){printf(%lld\n,i);return0;}}return0;}
延伸阅读

更多相关文章

2026/10/19 2:10:03

加减【牛客tracker 每日一题】

加减时间限制:1 秒 空间限制:256M题目描述 小红拿到了一个长度为 nnn 的数组。她每次操作可以让某个数加 111 或者某个数减 111。 小红最多能进行 kkk 次操作。她希望操作结束后,该数组出现次数最多的元素次数尽可能多。 你能求出这个最大的次…

2026/10/19 2:05:03

别把善良喂给狼:建立个人边界,远离情感绑架与过度付出

老王前天晚上找我喝酒,第一句话就是“兄弟,别再把善良喂给狼了”。他没头没尾,但我知道他说的是什么。帮亲戚担保了一笔钱,亲戚跑了;替同事连续加班挡了一个月的锅,评优时对方连名字都没提;朋友…

2026/10/19 2:05:03

技术博文创作前的信息整理:标题、描述与关键词的关键作用

项目标题: 【无标题】 项目正文: 关键词: 摘要描述:我无法基于空的输入内容生成一篇有实质价值的博文。要写出真正贴合需求、有干货、能直接参考复现的内容,我至少需要以下任一信息:项目标题(哪怕一句话也行,比如“用树莓派搭一个…

2026/10/19 3:25:06

Open-Code-Review:基于CLI+Git Diff+LLM的开放代码审查范式

1. “open-code-review”不是工具名,而是开源协作范式的重新定义很多人第一次看到“open-code-review”这个词,第一反应是——这是某个新出的 CLI 工具?是不是类似codex cli或claude code cli那种带大模型能力的代码审查命令行?我…

2026/10/19 3:25:06

open-code-review:一种基于Git Diff与LLM Agent的开放代码评审范式

1. “open-code-review”不是工具名,而是正在发生的开发范式迁移你最近在 GitHub 提交 PR 后,是不是发现评论区里多了一条带 🤖 图标的自动反馈?它没写“LGTM”,也没说“请加单元测试”,而是直接指出&#…

2026/10/19 3:25:06

open-code-review:基于git diff与本地LLM的轻量级代码评审范式

1. “open-code-review”不是工具名,而是一套可落地的代码评审新范式“open-code-review”这个词最近在开发者社区里频繁出现,但它既不是某个开源项目仓库的官方名称,也不是某家大厂刚发布的SaaS产品。我第一次在内部技术分享会上听到它&…

2026/10/19 3:25:06

open-code-review:基于Git Diff与CLI的AI代码审查范式

1. 项目概述:这不是又一个代码审查工具,而是一次开发工作流的底层重定义“open-code-review”这个名称乍看平平无奇,像极了某个开源社区里默默无闻的 GitHub 仓库名——但如果你最近在终端里敲过codex cli、在飞书机器人里配置过 LLM 接入、或…

2026/10/19 3:25:06

MATLAB项目迁移Python全流程复盘:规划、重构与AI辅助避坑

自己踩过不少坑,也帮别人擦过不少屁股,所以这篇东西我不想写成一板一眼的教程,更想把它当成一次"过来人复盘"。我会从迁徙项目的规划和拆解入手,再到实操落地、常见坑点,尽量把那些文档里不写、但实战中特别…

2026/10/19 3:20:06

五种经典排序算法详解:从原理到工程实践

排序算法这东西,科班出身的人大学里多少都学过,工作几年的老码农也不见得能徒手把每种细节都写对。前阵子我帮团队做一次代码评审,发现一个功能里明明只需要取前K个最大元素,结果有人直接写了个冒泡排序去排整个数组,数…

2026/10/18 0:01:50

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/19 0:04:56

悟空开源无代码平台实战:从实体建模到应用设计避坑指南

简介:基于悟空开源无代码平台的多种应用设计源码,面向希望在不编写代码的情况下快速搭建CRM、HRM、财务系统、ERP、SRM等业务应用的企业与技术人员,通过拖放式界面和内置模板即可完成应用定制与部署。压缩包共697个文件,约10.74MB…

2026/10/19 0:04:56

基于.NET9的多租户权限系统:数据权限与动态API落地实践

简介:这份资源是一套面向 .NET 与 Vue 全栈开发者的中台权限管理系统,后端基于 .Net9,前端采用 Vue3 Element Plus,并配套 uniapp uviewui 移动端方案,实现前后端分离。系统覆盖多租户隔离、数据权限、动态 Api、任务…

2026/10/19 0:04:56

场地预约小程序毕设实战:SSM+微信小程序+MySQL数据库设计到避坑

简介:面向毕业设计场景的场地预约小程序完整项目,基于微信小程序SSMMySql技术栈开发,适合计算机相关专业学生作为选题参考、功能扩展或二次开发起点。系统实现场地类型管理、场地管理、预约管理、取消申请与押金退回等功能,分为管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑