题意:

思路:令F[i][j]表示

的最小费用。Best[i]表示以i为根节点的子树多有节点都找到负责消防站的最小费用。

好难的题。。。

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 int tot,go[200005],first[200005],next[200005],val[200005];
 7 int dis[200005],f[2005][2005];
 8 int n,w[200005],d[200005],best[200005];
 9 void insert(int x,int y,int z){
10     tot++;
11     go[tot]=y;
12     next[tot]=first[x];
13     first[x]=tot;
14     val[tot]=z;
15 }
16 void add(int x,int y,int z){
17     insert(x,y,z);
18     insert(y,x,z);
19 }
20 void Dfs(int x){
21     for (int i=first[x];i;i=next[i]){
22         int pur=go[i];
23         if (dis[pur]!=-1) continue;
24         dis[pur]=dis[x]+val[i];
25         Dfs(pur);
26     }
27 }
28 void dfs(int x,int fa){
29     for (int i=first[x];i;i=next[i]){
30         int pur=go[i];
31         if (pur==fa) continue;
32         dfs(pur,x);
33     }
34     for (int i=1;i<=n;i++) dis[i]=-1;
35     dis[x]=0;
36     Dfs(x);best[x]=99999999;
37     for (int i=1;i<=n;i++) f[x][i]=99999999;
38     for (int i=1;i<=n;i++)
39      if (dis[i]<=d[x]){
40             f[x][i]=w[i];
41             for (int j=first[x];j;j=next[j]){
42                 int pur=go[j];
43                 if (pur==fa) continue;
44                 f[x][i]+=std::min(best[pur],f[pur][i]-w[i]);
45             }
46             best[x]=std::min(best[x],f[x][i]);
47     }
48 }
49 int main(){
50     int T;
51     scanf("%d",&T);
52     while (T--){
53         scanf("%d",&n);
54         for (int i=1;i<=n;i++) scanf("%d",&w[i]);
55         for (int i=1;i<=n;i++) scanf("%d",&d[i]);
56         tot=0;
57         for (int i=1;i<=n;i++) first[i]=0;
58         for (int i=1;i<n;i++){
59             int x,y,z;
60             scanf("%d%d%d",&x,&y,&z);
61             add(x,y,z);
62         }
63         dfs(1,0);
64         printf("%d\n",best[1]);
65     }
66 }

转载于:https://www.cnblogs.com/qzqzgfy/p/5553912.html

POJ 2152 Fire(树形DP)相关推荐

  1. POJ 2152 fire / SCU 2977 fire(树型动态规划)

    POJ 2152 fire / SCU 2977 fire(树型动态规划) Description Country Z has N cities, which are numbered from 1 ...

  2. POJ 2152 Fire

    算是我的第一个树形DP 的题: 题目意思:N个城市形成树状结构.现在建立一些消防站在某些城市:每个城市有两个树形cost(在这个城市建立消防站的花费),limit : 我们要是每个城镇都是安全的:就是 ...

  3. Tree Cutting POJ - 2378(树形DP)

    题意:有n个谷仓有n-1条路连接,问最少删除哪几个点才能使得删除点后得到的连通图的加点数不大于n/2. 分析:求树的重心的变形题,poj3107的简单版,一遍dfs从叶子到根转移找出找到以每个节点为根 ...

  4. The Lost House POJ - 2057(树形dp+贪心 (双线最优子结构问题))

    思路 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这 只蜗牛要求寻找它的房子,它又得从树根开始爬起,现在要求一条路径使得其找到房子 所要爬行 ...

  5. poj 2152 Fire - 经典树形dp

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

  6. POJ 2152 树型DP //很棒的题

    题意:Z国有n个城市,从1到n给这些城市编号.城市之间连着高速公路,并且每两个城市之间有且只有一条通路.不同的高速公路可能有不同的长度.最近Z国经常发生火灾,所以当地政府决定在某些城市修建一些消防站. ...

  7. POJ3345 Bribing FIPA 【背包类树形dp】

    题目链接 POJ 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 #include<iostream> #include<cstdio> #include<cm ...

  8. Fire (poj 2152 树形dp)

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

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

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

最新文章

  1. (转)Engineering Productivity
  2. Yoshua Bengio首次中国演讲:深度学习通往人类水平AI的挑战
  3. [网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二)
  4. nyoj--86--找球号(一)(hashset二分)
  5. PHP环境搭建和Apache HTTP服务器配置
  6. Linux编译soci库,Soci库linux下的编译方法
  7. 最全ARM汇编伪指令
  8. 计算机无法共享磁盘分区,win7系统下怎么创建虚拟磁盘分区以达到网络共享的目的...
  9. 【数据仓库】Inmon与Kimball数仓理论对比
  10. WorkFlow入门Step.3—Adding Procedural Elements-For...
  11. java_web基本概念
  12. “SCSA-S学习导图+”系列:文件解析
  13. 计算机辅助三维参数化设计是什么,滚子链轮的计算机辅助三维参数化设计.pdf...
  14. wordpress炫酷主题Salient最新版13.0.5 汉化版免费下载
  15. 基于PyQt5实现保存网页为pdf
  16. Gopher协议与ssrf
  17. C++ SLT总结1
  18. Java中基本数据类型和包装类型的区别
  19. Docker容器技术 笔记
  20. k歌打分原理php,全民K歌修音教程:想要获得SSS评分其实很简单

热门文章

  1. php前端开发语言,web前端编程语言有哪些?
  2. 删除表格数据后自动刷新_表格中一键即可删除重复数据,你居然还用逐条排查?...
  3. Java-ThreadLocal三种使用场景
  4. 错误:Subquery returns more than 1 row 表示子查询返回了多行数据
  5. 语音识别2:CTC对齐的算法
  6. vue/cli 3.0 与 2.0脚手架怎样mock数据
  7. 【Java】练习题:数字判断
  8. 【面试练习题】存在序列:1,1/2,2/3,3/5,5/8,8/13...,求前10项的和
  9. linux vi 批量修改某类字符串
  10. win10 linux ssh自动启动,win10子系统 wsl开机启动ssh服务