算是我的第一个树形DP 的题:

题目意思:N个城市形成树状结构。现在建立一些消防站在某些城市;每个城市有两个树形cost(在这个城市建立消防站的花费),limit ;

  我们要是每个城镇都是安全的:就是每个距离这个城镇最近的消防站不能超过这个城镇的limit值;

解法:这个题目乍一看卧槽怎么玩!玩不了啊!先给出dp[i][j]( I 依靠J,并且 I 这课子树都已经被覆盖的最优解(不一定都被J覆盖));

  假设一个节点的亲儿子树都被解决完毕,我们对于这些 亲儿子树 和这个 节点所组成的树的解如何得出?

  初始化dp[i][j]=cost[j];

  无疑使枚举这个节点I 依靠的节点,然后得出最小值;

  而这些 亲子树的合并无疑有俩情况

  1:这些亲儿子树依靠这个节点J  值 dp[k][j]-cost[j];

  2:这些亲儿子树不依靠这个节点I 值

      {

        int best=0x7fffffff;

        for(int w=1;w<=n;w++)

          best=min(dp[k][w],best);

        >>>best;

      }

  所以我们要开一个数字组维护每个节点的最值;

我输得不清楚那么百度下“国家集训队2006论文集 陈启峰”

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn=1004;
const int INF=0x7fffffff;
struct Edge
{int to,dis,pre;Edge(int to=0,int dis=0,int pre=0):to(to),dis(dis),pre(pre){}
};
Edge edge[maxn*2];
int head[maxn],pos;
int dp[maxn][maxn];
int dis[maxn][maxn];
int limit[maxn],cost [maxn];
int best[maxn];
int n,start;void inint()
{for(int i=1;i<maxn;i++){best[i]=INF;for(int j=1;j<maxn;j++)dp[i][j]=INF;}memset(head,-1,sizeof(head));pos=0;
}
void add_edge(int s,int to,int dis)
{edge[pos]=Edge(to,dis,head[s]);head[s]=pos++;
}
void DIS(int pa,int s)
{for(int i=head[s];~i;i=edge[i].pre){Edge &tmp=edge[i];if(tmp.to==pa)continue;dis[start][tmp.to]=dis[start][s]+tmp.dis;DIS(s,tmp.to);}
}
void dfs(int pa,int s)
{for(int i=head[s];~i;i=edge[i].pre){Edge &tmp=edge[i];if(tmp.to==pa)continue;dfs(s,tmp.to);}for(int i=1;i<=n;i++)if(dis[s][i]<=limit[s]){dp[s][i]=cost[i];for(int j=head[s];~j;j=edge[j].pre){Edge &tmp=edge[j];if(tmp.to==pa)continue;dp[s][i]+=min(dp[tmp.to][i]-cost[i],best[tmp.to]);//加等}best[s]=min(best[s],dp[s][i]);}
}
int main()
{int t;int a,b,c;scanf("%d",&t);while(t--){inint();scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&cost[i]);for(int i=1;i<=n;i++)scanf("%d",&limit[i]);for(int i=2;i<=n;i++){scanf("%d%d%d",&a,&b,&c);add_edge(a,b,c);add_edge(b,a,c);}for(int i=1;i<=n;i++)start=i,DIS(-1,i);dfs(-1,1);printf("%d\n",best[1]);}return 0;
}

转载于:https://www.cnblogs.com/shuly/p/3877105.html

POJ 2152 Fire相关推荐

  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

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

  3. POJ 2152 Fire(树形DP)

    题意: 思路:令F[i][j]表示 的最小费用.Best[i]表示以i为根节点的子树多有节点都找到负责消防站的最小费用. 好难的题... 1 #include<algorithm> 2 # ...

  4. Fire (poj 2152 树形dp)

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

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

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

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

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

  7. 【缄*默】 #DP# 各种DP的实现方法(更新ing)

    DP =「状态」+「阶段」+「决策」 基本原理 = 「有向无环图」+「最优子结构」+「无后效性」 目录 一. 线性DP { 1.概念引入 } { 2.例题详解 } [例题1]caioj 1064 最长 ...

  8. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  9. POJ 动态规划题目列表

    1.这份列表当然不是我原创的,从文库里下载了一份,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号: 容易:  1018, 1050 ...

最新文章

  1. 牛客网_剑指Offer_Python实现_更新中
  2. 太棒啦!PyCharm与Jupyter完美融合,Jupytext来啦!
  3. 根据卡号获取银行卡名字
  4. 如何扩展以太坊:分片
  5. unity------------------------------transform.forward与Vector.forward的区别
  6. mybatis和hibernate的区别---Mybatis的学习笔记(四)
  7. c语言程序输入n个数字排序,输入n个数字然后进行排序,用C语言编写。注意是n个数啊,不是确定的个数。...
  8. python中缩进在程序中_python代码缩进
  9. 信息学奥赛一本通(1021:打印字符)
  10. 查找文章中出现频率最高的单词
  11. JQUERY--图片轮换superslide(
  12. 公平的反义词是什么?
  13. zabbix 系统IO监控_自动发现
  14. 学单片机的动力是什么,学单片机来做什么,需要多长时间把它学会
  15. Eigen编译_Eigen向量化_内存对齐 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
  16. OFD文件在线阅读器
  17. 在CentOS8下安装搭建gitlab下载安装备份升级迁移记录
  18. 四层七层负载均衡区别
  19. macbook系统占用硬盘大_苹果电脑系统占用硬盘过大,怎么解决
  20. [一步一步MVC]第四回:漫谈ActionLink,有时“胡搅蛮缠”

热门文章

  1. 基于UDP/TCP的网络协议(端口分配)
  2. Eclipse安装Perl插件
  3. python邮件转发_把Gmail邮件转发到gtalk的Python方法
  4. 依据imu姿态角计算z轴倾角_1. 姿态的表示方法
  5. python做excel数据分析统计服_Python也能做到Excel那样,条件统计轻松解决工作需求...
  6. matlab 点云特征_基于点云的3D障碍物检测
  7. pytorch test单张图片_PyTorch版EfficientDet比官方TF实现快25倍?这个GitHub项目数天狂揽千星...
  8. c语言数组中两元素交换,如可交换两个数组中的元素?
  9. 对promise.all底层的实现的研究
  10. Python打卡第四周