当前位置: 首页 > news >正文

P1273 有线电视网

P1273 有线电视网

题目描述
某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。

从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费用总和。

现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定给哪些用户提供信号而不给哪些用户提供信号。

写一个程序找出一个方案使得有线电视网在不亏本的情况下使观看转播的用户尽可能多。

Solution

以前(两天前)以为树上背包就是个板, 没想到可以有变化的。。还是太弱了
之前一般设计的状态为 \(dp[u][j]\) 表示 \(u\) 节点选择 \(j\) 个用户可以获得的利益最大值
那么当转移到根节点时倒叙看看有哪个点利益大于等于 \(0\) 则就是最多能提供的用户啦
转移同一般的树上背包
本来觉得需要先处理出一个节点子树中的子节点数, 不然无法完全转移
后面才发现 是可以从从容量小的转移过去的啊
是可以从容量小的转移过去的啊 还造了了数据跑看能不能 \(hack\) 来着
嘛, 有点探究精神总归是好的啦

认真想清楚模型的意义,搞明白为什么可以这样,而不是简单的知道怎样做,就套上一个模板了事,那样,是不是也太糟蹋这门科学了

Code

预处理の原版

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define LL long long
#define REP(i, x, y) for(int i = (x);i <= (y);i++)
using namespace std;
int RD(){
    int out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
const int maxn = 6019,INF = 1e9 + 19;
int head[maxn],nume = 1;
struct Node{
    int v,dis,nxt;
    }E[maxn << 3];
void add(int u,int v,int dis){
    E[++nume].nxt = head[u];
    E[nume].v = v;
    E[nume].dis = dis;
    head[u] = nume;
    }
int num, m, val[maxn];
int size[maxn];
int dp[maxn][maxn];//dp[u][j]代表子树中有j个用户时获利最大值
void dfs1(int u, int F){
    size[u] = 0;
    if(u >= num - m + 1){size[u] = 1;return ;}
    for(int i = head[u];i;i = E[i].nxt){
        int v = E[i].v;
        if(v == F)continue;
        dfs1(v, u);
        size[u] += size[v];
        }
    }
void dfs2(int u, int F){
    if(u >= num - m + 1){dp[u][1] = val[u];return ;}
    dp[u][0] = 0;
    for(int i = head[u];i;i = E[i].nxt){//枚举组
        int v = E[i].v;
        if(v == F)continue;
        dfs2(v, u);
        for(int j = size[u];j >= 0;j--){//枚举能接纳的用户数
            REP(k, 0, size[v]){//选一下吧
                if(j >= k)dp[u][j] = max(dp[u][j], dp[u][j - k] + dp[v][k] - E[i].dis);
                }
            }
        }
    }
int main(){
    num = RD(), m = RD();
    REP(i, 1, num - m){
        int k = RD();
        while(k--){
            int v = RD(), dis = RD();
            add(i, v, dis), add(v, i, dis);
            }
        }
    REP(i, num - m + 1, num)val[i] = RD();
    dfs1(1, -1);//预处理子树中子节点大小
    REP(i, 1, num)REP(j, 0, size[1])dp[i][j] = -1e9;
    dfs2(1, -1);
    printf("%d\n", dp[1][5]);
    }

转载于:https://www.cnblogs.com/Tony-Double-Sky/p/9812974.html

相关文章:

  • DotText源码阅读(2)-工程、数据库表结构
  • 23 Java学习之RandomAccessFile
  • 在本地机上还复在另一台机器上备份的数据库
  • CF535E Tavas and Pashmaks 单调栈、凸包
  • Java开发知识之Java中的泛型
  • {防}5--WMI入侵的防范
  • 开撕队-软件需求规格说明书
  • 根据企业信息化应用需求来分析工作流平台的选型
  • 约束
  • 办公室女性的心得感悟:生活中最重要的五句话
  • Sabota?
  • 受损Wave文件修复
  • c/c++ llinux epoll系列4 利用epoll_wait实现非阻塞的connect
  • 清蒸鲈鱼
  • Ubuntu18.0.4配置Hadoop1.2.1环境
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • java正则表式的使用
  • Js基础知识(一) - 变量
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Swift 中的尾递归和蹦床
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端攻城师
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 思考 CSS 架构
  • 算法系列——算法入门之递归分而治之思想的实现
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (day 12)JavaScript学习笔记(数组3)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (多级缓存)多级缓存
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)关于多人操作数据的处理策略
  • (转)甲方乙方——赵民谈找工作
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • *Django中的Ajax 纯js的书写样式1
  • .bat批处理(一):@echo off
  • .gitignore文件_Git:.gitignore
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .Net的C#语言取月份数值对应的MonthName值
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [BZOJ 3282] Tree 【LCT】
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [EFI]MSI GF63 Thin 9SCXR电脑 Hackintosh 黑苹果efi引导文件
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件
  • [Hive] 常见函数