算是我的第一个树形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=;
const int INF=0x7fffffff;
struct Edge
{
int to,dis,pre;
Edge(int to=,int dis=,int pre=):to(to),dis(dis),pre(pre){}
};
Edge edge[maxn*];
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=;i<maxn;i++)
{
best[i]=INF;
for(int j=;j<maxn;j++)
dp[i][j]=INF;
}
memset(head,-,sizeof(head));
pos=;
}
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=;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=;i<=n;i++)scanf("%d",&cost[i]);
for(int i=;i<=n;i++)scanf("%d",&limit[i]); for(int i=;i<=n;i++)
{
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
add_edge(b,a,c);
}
for(int i=;i<=n;i++)start=i,DIS(-,i);
dfs(-,);
printf("%d\n",best[]);
}
return ;
}

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 题意: n个节点组成的树,要在树一些点上建立消防站,每个点建站都有个cost[i],每个点如果不在当前的点上建站,也要依赖其他的消防站,并 ...

  3. POJ 2152 Fire(树形DP)

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

  4. POJ 2152 Fire (树形DP,经典)

    题意:给定一棵n个节点的树,要在某些点上建设消防站,使得所有点都能够通过某个消防站解决消防问题,但是每个点的建站费用不同,能够保证该点安全的消防站的距离上限也不同.给定每个点的建站费用以及最远的消防站 ...

  5. 【POJ 2152】 Fire (树形DP)

    Fire   Description Country Z has N cities, which are numbered from 1 to N. Cities are connected by h ...

  6. Fire (poj 2152 树形dp)

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

  7. 【POJ 2152】 Fire

    [题目链接] 点击打开链接 [算法] 同样是树形DP,但是比较难,笔者做这题看了题解 令f[i][j]表示在以i为根的子树中 1.在以i为根的子树中建一些消防站 2.在节点j必须建一个消防站 3.以i ...

  8. POJ 2607 Fire Station(Floyd打表+枚举更新最优)

    题目链接: http://poj.org/problem?id=2607 Description A city is served by a number of fire stations. Some ...

  9. POJ 2607 Fire Station

    Fire Station Time Limit: 5000ms Memory Limit: 65536KB This problem will be judged on PKU. Original I ...

随机推荐

  1. ZooKeeper的安装、配置、启动和使用(一)——单机模式

    ZooKeeper的安装.配置.启动和使用(一)——单机模式 ZooKeeper的安装非常简单,它的工作模式分为单机模式.集群模式和伪集群模式,本博客旨在总结ZooKeeper单机模式下如何安装.配置 ...

  2. Just learn how to use the JNI

    JNITestProject Just learn how to use the JNI Refer : 1. ant usage http://lmbj.net/blog/ant-build-and ...

  3. R语言与数据分析之九:时间内序列--HoltWinters指数平滑法

    今天继续就指数平滑法中最复杂的一种时间序列:有增长或者减少趋势而且存在季节性波动的时间序列的预測算法即Holt-Winters和大家分享.这样的序列能够被分解为水平趋势部分.季节波动部分,因此这两个因 ...

  4. C语言里为何会有“2+2=5”的结果

    写这篇原创文章是由于看到了极客中的一篇文章<有趣各种编程语言实现2+2=5>,当中C语言是这样实现的: int main() { char __func_version__[] = &qu ...

  5. Codeforces Round #252 (Div. 2) B. Valera and Fruits(模拟)

    B. Valera and Fruits time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. 通用型CRM还是行业型CRM?-定制为王

    大数据时代,怎样利用工具摆脱繁杂的数据管理之苦,洞察有价值的销售信息,是每一个管理者的迫切须要.Zoho  CRM问世10年来,见证了一个个行业客户怎样在CRM帮助下实现了效率和业绩提升.相同,广泛的 ...

  7. MyEclipse 2013 新功能介绍

    http://pan.baidu.com/share/link?shareid=3310814720&uk=4012618212 下载地址 HTML5 Mobile Projects MyEc ...

  8. 登录oracle时,scott is locked (帐户被锁定) 的解决方法

    登录Oracle时,用scott/tiger  通常此时会报一个错误: scott is locked (帐户被锁定) 现在就要用超级用户system将scott帐户进行解锁. cmd->sql ...

  9. SWT中的GridLayout(转)例子不错

    GridLayout 是一个非常强大的布局管理器,它可以实现很多复杂的布局,名字中暗示它将所有控件放置在类似网格的布局中.^__^GridLayout 有两个构造函数. GridLayout的构造函数 ...

  10. docker 的安装

    官方站点上有各种环境下的 安装指南,这里主要介绍下Ubuntu和CentOS系列的安装. Ubuntu 系列安装 Docker 通过系统自带包安装 Ubuntu 14.04 版本号系统中已经自带了 D ...