题意:给定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;
}

poj 2152 树形dp(建立消防站)相关推荐

  1. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  2. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  3. poj 2342 树形DP

    树形DP入门题目. 树形DP说白了就是在搜索的时候动态规划. 只要你懂的深搜+动态规划,就能理解这个基础题了. 先直接搜索到最底层,然后一层一层动态规划,可以说有点像数塔. dp[i][1],dp[i ...

  4. poj 2486 树形dp

    思路:这题是裸的树形dp.dp[i][j]表示第i个节点花费j步并且从子节点返回,能得到的最大苹果数:nback[i[j]表示第i个节点花费j步并且进入某个子节点不返回,能得到的最大苹果数.那么我们就 ...

  5. POJ 2342 (树形DP)

    题目链接: http://poj.org/problem?id=2342 题目大意:直属上司和下属出席聚会.下属的上司出现了,下属就不能参加,反之下属参加.注意上司只是指直属的上司.每个人出席的人都有 ...

  6. poj 1947(树形dp+背包问题)

    题大意是:给你一棵节点为n的树,问至少砍几刀可以孤立出一棵节点为m的子树. 解题思路:这题很容易想到状态dp[i][j]表示以i节点为根,节点总数为j的子树最少需要切几刀.但是这个状态方程确实很难想, ...

  7. poj 3417 树形dp+LCA

    思路:我以前一直喜欢用根号n分段的LCA.在这题上挂了,第一次发现这样的LCA被卡.果断改用Tarjan离线算法求LCA. 当前节点为u,其子节点为v.那么: 当以v根的子树中含有连接子树以外点的边数 ...

  8. poj 2057 树形DP,数学期望

    题目链接:http://poj.org/problem?id=2057 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这只蜗牛要求寻找它的房子 ...

  9. POJ 1155 TELE【树形DP】

    POJ 1155 TELE http://poj.org/problem?id=1155 大意:某电台要广播一场比赛,该电台网络是由N个网点组成的一棵树,其中M个点为客户端, 其余点为转发站.客户端i ...

最新文章

  1. Windows安装MongoDB可视化工具adminMongo
  2. php ios视频文件上传,iOS实现视频和图片的上传思路
  3. bzoj1588[HNOI2002]营业额统计
  4. java高级应用:线程池全面解析
  5. java数组有跨类建立对象_Java性能优化的45个细节(珍藏版)
  6. PyTorch 1.0 中文官方教程:基于注意力机制的 seq2seq 神经网络翻译
  7. android版本更新代码
  8. win定时关机_电脑定时关机,你造吗?
  9. apk反汇编之smali语法
  10. 2012浙江大学光华法学院毕业典礼教师发言之高艳东
  11. 高数 | 华里士公式大全
  12. 前端轻量级的toolTip插件-Tippy.js
  13. LiveNVR监控流媒体Onvif/RTSP功能-Onvif 发现以及探测通过ONVIF添加摄像头监控直播及云台控制
  14. 如何使用DolphinDB处理Tushare金融数据
  15. 如何制作RJ45超五类线缆?六个步骤搞定!
  16. 给入门程序员找培训班的一些建议
  17. deepin20.7隐藏分区
  18. sfc /scannow扫描修复系统文件命令怎么用_马立杰_新浪博客
  19. HDMI接口与HDMI协议
  20. 用计算机中的知识秀恩爱,自从用专业知识改了情侣名,女友再也不逼我秀恩爱了...

热门文章

  1. 终于等到了!十位Java架构师整理的“阿里P7”养成计划
  2. 苹果列出了app被拒最常见原因,你中枪了吗?
  3. 「大数据的关键思考系列」15:阿里巴巴的大数据实践(1)
  4. python统计奇数和偶数的个数_Python 统计位数为偶数的数字的代码
  5. html广告横幅图片,制作漂亮网页横幅广告图片的PS教程
  6. DHCP Snooping IPSG
  7. arch linux开启dhcp,ArchLinux DHCP配置问题
  8. mac小技巧之打印文件
  9. 通用产品 云OA SaaS三管齐下
  10. 查看及更改计算机名或域,如何查看和修改计算机名、域和工作组