poj 2152 树形dp(建立消防站)

P2279 [HNOI2003]消防局的设立 -------树形dp,详细题解 题目 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地。起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构。如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d 由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局。消防局只能修建在基地里,每个消防局有能力扑灭与它距离不... 阅读详情

题意:给定n个节点组成的树,树边有权。现在要在一些点上建立消防站,每个点建站都有花费cost[i]。如果某点上没有消防站,那么在距离它d[i]之内的某个点上必须有消防站。求符合上述条件的最小费用建站方案。n <= 1000。

思路:知道是树形dp,但是该怎么做一直想不出来。只能看别人的题解,发现在陈启峰2006年的《一张一弛,解题之道 ——“约制、放宽”方法在解题中的应用》论文中提到了这道题的解法。大题思路是:设dp[i][j]表示i点及其子树都符合情况下,并且i点依赖j点的最小花费。best[i]表示以i为根的子树符合题目要求的最小花费。这样状态转移方程就是dp[i][j] = cost[j] + sum(min(dp[k][j]-cost[j],best[k])) (k为i的子节点,j为我们枚举的n个点),因为i的每个子节点可以和i一样依赖j结点(也即best[k]在dp[k][j]处取到),那么花费是dp[k][j]-cost[j],或者依赖以k为根的树中的某点,花费是best[k],最后再加上cost[j],因为要在j结点建站所以要增加花费。

比较费解的是求两点间距离时一开始写的bfs(代码中的bfs2),C++交会TLE,于是改成dfs(代码中的bfs)来写就过了。但是后来试了一下bfs用g++交是能够A的。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
#define INF 0x3fffffff
#define clr(s,t) memset(s,t,sizeof(s))
#define N 1005
int w[N],d[N],dis[N][N],dp[N][N],first[N],res[N];
struct edge{
    int y,c,next;
}e[N<<1];
int T,n,top;
void add(int x,int y,int c){
    e[top].y = y;
    e[top].c = c;
    e[top].next = first[x];
    first[x] = top++;
}
void bfs(int s,int x,int fa){
    for(int i = first[x];i!=-1;i=e[i].next)
        if(e[i].y != fa){
            dis[s][e[i].y] = dis[s][x]+e[i].c;
            bfs(s,e[i].y,x);
        }
}
void bfs2(int x){
     queue<int> q;
     int i,now;
     q.push(x);
     dis[x][x] = 0;
     while(!q.empty()){
         now = q.front();
         q.pop();
         for(i = first[now];i!=-1;i=e[i].next)
             if(dis[x][e[i].y]==-1){
                 dis[x][e[i].y] = dis[x][now]+e[i].c;
                 q.push(e[i].y);
             }
     }
}
void dfs(int x,int fa){
    int i,j,y;
    for(i = first[x];i!=-1;i=e[i].next)
        if(e[i].y != fa)
            dfs(e[i].y,x);
    for(i = 1;i<=n;i++){
        dp[x][i] = INF;
        if(dis[x][i] <= d[x]){
            dp[x][i] = w[i];
            for(j = first[x];j!=-1;j=e[j].next){
                y = e[j].y;
                if(y==fa)
                    continue;
                dp[x][i] += min(dp[y][i]-w[i],res[y]);
            }
        }
        res[x] = min(res[x],dp[x][i]);
    }
}
int main(){
    scanf("%d",&T);
    while(T--){
        int i,a,b,c;
        clr(first, -1);
        top = 0;
        scanf("%d",&n);
        for(i = 1;i<=n;i++)
            res[i] = INF;
        for(i = 1;i<=n;i++)
            scanf("%d",&w[i]);
        for(i = 1;i<=n;i++)
            scanf("%d",&d[i]);
        for(i = 1;i<n;i++){
            scanf("%d %d %d",&a,&b,&c);
            add(a,b,c);add(b,a,c);
        }
        
        /*clr(dis, 0);
        for(i = 1;i<=n;i++)
            bfs(i,i,0);*/
        
        clr(dis, -1);
        for(i = 1;i<=n;i++)
            bfs2(i);
        dfs(1,-1);
        printf("%d\n",res[1]);
    }
    return 0;
}


LwIP TCP Client 解决长数据发送的困扰 问题描述 LWIP 的 TCP Client 发送数据可以调用 tcp_write() 函数,将数据储存在缓冲区里面,然后等待超时自动发送或者调用tcp_output()函数进行发送。 然而 tcp_write() 函数 需要发送的数据过长时,将无法发送,并返回 ERR_MEM。 tcp_write()函数解析 tcp_write()的函数代码很多,就不细看代码了, 先看tcp_write()的完整函数: err_t tcp_write(struct tcp_pcb *pcb, const void 阅读详情

相关推荐

DevEco Studio在初始化时出现Installing pnpm@8.13.1...npm ERR! code ETIMEDOUTnpm ERR! syscall connectnpm E

npm的仓库源设置的有问题,下载不了鸿蒙相关组件,所以你的启动依赖都没有,或者以前下载过npm,使用的源改的乱七八糟了。以前安装过前端相关的node.js的话,启动的时候记得使用管理远权限。(DevEco Studio)就出错,npm显示超时。

qq_56392862的博客 2628

POJ 2152 Fire (树形DP,有趣)

我发现树形DP越来越有趣了……或者说树真的是一个很美妙的数据结构。 【题意】n个节点组成的树,要在树一些点上建立消防站,每个点建站都有个cost[i],每个点如果不在当前的点上建站,也要依赖其他的消防站,并且距离不超过limit[i]。求符合上述条件的最小费用建站方案。n 【思路】 想了很久没什么想法,状态表示和转移都没什么头绪……发现每个点它能从很多地方获取信息(父亲,爷爷,兄弟,叔

卡尔 1366

计算机视觉-全景图像拼接中的特征匹配与优化策略

本文深入探讨了计算机视觉中全景图像拼接的核心技术,重点解析了特征匹配后的关键优化策略。通过SIFT特征提取、RANSAC算法剔除误匹配,并结合APAP算法应对视差与鬼影问题,详细阐述了从基础对齐到无缝融合的完整流程,为开发者实现高质量全景拼接提供了实用指南。

weixin_29039773的博客 361

消防局的设立(树形DP)

消防局的设立 2020 年,人类在火星上建立了一个庞大的基地群,总共有 n 个基地。起初为了节约材料,人类只修建了 n-1 条长为 1的道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构。 由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局。消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过 2 的基地的火灾。 你的任务是计...

DD(XYX)的硫氰化氘博客 507

RK3568平台(USB篇)USB基础知识

现象:把USB设备比如Android手机接到PC答1:是USB控制器,是USB控制器内嵌的root hub.答2. windows里已经有了USB的总线驱动程序,接入USB设备后,是"总线驱动程序"知道你是"android phone"提示你安装的是"设备驱动程序"。USB总线驱动程序负责:识别USB设备, 给USB设备找到对应的驱动程序。答3. PC的USB口内部,D-和D+接有15K的下拉电阻,未接USB设备时为低电平USB设备的USB口内部,D-或D+接有1.5K的上拉电阻;

weixin_49303682的博客 1658

XSS漏洞之PDF生成:从XSS到服务端任意文件读取

XSS是最为常见的Web漏洞之一,多年来连续入选OWASP TOP10,相信大家都耳熟能详。 它是一种代码注入类的攻击,是一种客户端侧的攻击,攻击者通过在Web应用中注入恶意JavaScript代码,通过点击URL,最终在受害者浏览器端执行的一种漏洞。主要有反射型XSS、存储型XSS、基于DOM的XSS三类。XSS一些比较常规的危害大概有:重定向浏览器、窃取Cookie、浏览器劫持等。本文章侧重于发现XSS后的进一步利用。 主要介绍在某次实际测试过程中,发现XSS漏洞之后,如何进一步的利用,最终通过XSS达

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 3777

P2279 消防局的设立 (树形DP or 贪心)

(点击此处查看原题) 树形DP写法 看到这个题的要求,很容易相到这是一个树形DP的问题,但是dp数组应该如何设计并转移才是关键 dp[i][0]代表当前结点可以向上覆盖2层,自身一定被覆盖dp[i][1]代表当前结点可以向上覆盖1层,自身一定被覆盖dp[i][2]代表当前结点可以向上覆盖0层,自身一定被覆盖dp[i][3]代表当前结点可以向下覆盖1层,表示自己不一定被覆盖,但是儿子...

weixin_30497527的博客 276

**YOLOv11性能突破:基于YOLOv10-PSA注意力机制的目标检测革命性升级**

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!

m0_71589036的博客 194

【训练题6:树形DP】消防局的设立 | 洛谷P2279

消防局的设立 | 洛谷P2279 难度 4.2/104.2/104.2/10 树形DP经典题 题意 给你一个 NNN 个节点的树。 你可以在一些节点放置消防站,放置后与该节点距离 d≤2d\le 2d≤2 的节点算被覆盖到了。 求覆盖所有节点,最少需要放几个消防站。 数据范围 1≤n≤10001\le n\le 10001≤n≤1000 (但该题该算法甚至可以解 n≤1e7n\le 1e7n≤1e7 的数据) 思路 是一个树,我们就不能把它想成一个图来考虑,否则会很难分析。 我们考虑在树中间的一个节

溢流眼泪的博客 388

AI人工智能领域多模态数据融合在智能诊断系统的应用案例

在医疗诊断领域,单一模态数据(如CT影像或电子病历)的局限性日益凸显——就像老中医只"望"不"闻"会漏掉关键线索。本文将深入解析多模态数据融合技术如何突破这一瓶颈:从生活化的"中医四诊"类比切入,拆解数据层/特征层/决策层融合的技术原理;结合肺癌智能诊断的真实案例,展示CT影像、病理文本、基因数据、生命体征的多模态融合全流程;最后探讨技术落地的核心挑战与未来方向。无论你是医疗从业者、AI开发者,还是对智能诊断感兴趣的爱好者,都能从中获得技术启发与应用思路。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 832

基于STM32L4XX、HAL库的AD7124-8BCPZ模数转换器ADC驱动程序设计

/ 公式: Voltage = (adc_value / (2^23 - 1)) * Vref。// 模式控制位[7:5]=000 (连续转换模式)// 3.2 配置通道0,使其使用AIN0(+)和AIN1(-),并关联到配置0和滤波器0。= 0x14) { // AD7124-8的ID是0x14。// 双极性操作,缓冲AINP/AINN。

zhusl6688的博客 374

树形dp(Fire)

POJ 2152 经典树形dp 一张一弛,解题之道陈启峰 具体证明点上面的链接,最后一个例题就是题意也在里面;#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> const int maxn=1e6+10; const int inf=0x3f3f3f3f; using namespace std;

ACMer_ZP的博客 463

mapbox 从入门到精通 - 目录

欢迎大家来到gis分享者的《mapbox 从入门到精通》专栏。博主列出学习大纲,如果有什么问题,欢迎留言。

我哎GIS博客 5833

poj2152(Fire) 树形DP

题目链接:http://poj.org/problem?id=2152 题意:一棵带边权的树,边权表示节点间距离,在i上建立消防站的代价是w[i],如果在一点i没建消防站,那么它与距离这个点最近的消防站之间的距离不能大于d[i]。问满足建站最小的花费; 解法;看了陈启峰的论文才会的,感觉挺难的,不过论文里分情况讨论了,应该不需要;dp[i][j]表示在i处选择j处作为供应站(但是并不一

xiefubao的专栏 1039

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

POJ 2152 经典树形dp

Fire Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 972   Accepted: 463 Description Country Z has N cities, which are numbered from 1 to N. Cities are connect

_rabbit的专栏 1363

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

poj 2152 Fire - 经典树形dp

题目链接: http://poj.org/problem?id=2152 不多说。。  2006 陈启峰消防站解题报告 这dp简直是神了。。 #include #include #include #include #include #include #include #include #include #include #include #includ

呼,是出一口气;吸,是争一口气! 666

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Poj 2152 Fire (DP_树形DP)

题目链接:http://poj.org/problem?id=2152 题目大意:给定n个节点组成的树,树有边权.现在要在一些点上建立消防站,每个点建站都有个cost[i],如果不在当前的点上建站,也要依赖其他的消防站,并且距离不超过limit[i]。求符合上述条件的最小费用建站方案。n 解题思路:复杂度为O(n^2)的树形DP.因为要依赖其他站点,所以不仅仅只从子树中获

3277

【POJ 2152】Fire【树形DP】

题意:给出一棵树,要求在节点出

Hacb的专栏 474

Fire (poj 2152 树形dp)

Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000)。现在要选择某些点,使得整棵树都被覆盖到。当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同时花费为v[i]。问最小花费。 以前做过一道类似的题(水库),这道题也差不多。首先来考虑,用\(best[i]\)表示以i为根的子树的最小花费。这样做有什么问题呢?它无法很好的处理消防站...

171

POJ2152 树形DP

题意:这一题是陈启锋的论文中

江上白衣凌云 1003

POJ 2152 Fire(依赖型树形dp)

题目链接: POJ 2152 Fire 题意: 给一个nn个节点和n−1n-1条边的树,边权代表距离,要在这些点中选择一些点建立消防站,使得每个点都会被消防站覆盖到。每个点有两个属性:cost[i]cost[i]表示在这个点建立消防站的代价,limit[i]limit[i]表示当某个消防站离ii的距离不超过limit[i]limit[i]时,这个点就可以认为被该消防站覆盖,求使得nn个点都被

ramay7 620

【POJ2152】Fire——树形DP

Fire 树形DP

Johann的博客 737

【poj2152】Fire 树形DP

DescriptionCountry Z has N cities, which are numbered from 1 to N. Cities are connected by highways, and there is exact one path between two different cities. Recently country Z often caught fire, so t

DQS的树洞 1346

poj2152 Fire(树形DP)

题目链接:https://vjudge.net/problem/POJ-2152 题意:给定一颗大小为n的树,在每个结点建消防站花费为w[i],如果某结点没有消防站,只要在它距离<=d[i]的结点有消防站即可,求最小花费。 思路:   好难的树形dp,一点思绪也木有,只能搜题解。   用dp[u][i]表示以u为根的子树满足条件,并且结点u依赖于结点i的最小花费。用best...

weixin_30757793的博客 180

POJ 2152 Fire 很难的树形DP

题意:有N个城市,连接这些城市的道路组成了一个树形的结构。现在想在一些城市建立消防站。如果选择在城市i建立消防站,需要的费用是w i  w_i,这个消防站负责该城市的防火工作。如果不选择建立消防站,那在距离为d i  d_i的范围内要有一个消防站来负责城市i的防火工作。现在想让所有城市都能保证安全,求最小的费用。 思路:想了很长时间,以为和前面的独立集是相关的,但是怎么也想不出来。。就去搜题解了。

leodestiny 1286

【DP_树形DP专辑】【9月9最新更新】

树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树、三叉树、静态搜索树、AVL树,线段树、SPLAY树,后缀树等等..      枚举那么多种数据结构只是想说树方面的内容相当多,本专辑只针对在树上的动态规划,即树形DP.做树形DP一般步骤是先将树转换为有根树,然后在树上

1万+
上一篇: poj 3345 树形dp(收买国家)
下一篇: Bhattacharyya distance(巴氏距离)
dumeichen
博客等级 码龄13年 55粉丝 475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值