poj 2152 一道很难的树型DP

原创 2012年07月26日 11:17:44

题目:poj 2152  Fire

         我想说的:以前做背包的题目做多了,脑子形成了一种就是所有动态规划就是在数组上进行等一些固定的思想。结果最近在做一些题目的时候,感觉无从下手,想好久都没结果。非常庆幸自己做了这类题目,让我从那种狭隘的思想中做出来。以后就要根据实际情况研究状态了。

         题意:有n个城市,每两个城市只有一条路连接,(所以可以当成是一颗树)。现在要建设一些防火站,使每个城市都可以被覆盖。每个城市的属性是:在本城市建防火站的价钱和不在本城市建设的话,所依赖的别的防火站的最长距离。然后是n-1条路,和这条路的长度。现在问在覆盖所有城市的前提下的最少价格。

         解题:首先要说的是,感觉这个题目很难,自己想了一天,然后看了一天的解题报告,包括国家集训队论文,陈启峰2006年的一张一弛,解题之道 ——“约制、放宽”方法在解题中的应用》,结果还是不明白,最后只有对着讲解,看代码,模拟,最后又花费了一上午的时间理解了一个大概,现在就用自己理解的来说一下吧。

        dp[i][j]:表示以i为根的子树里修建一些消防站,并在节点j处修建一消防站,i的负责站必须是j;

    best[i]:表示表示以i为根的子树的所有节点都有负责站的最小花费。

    dist[i]:表示i到x的距离(每换换一个节点,都要再求一次dist[])。

    状态状态转移方程:dp[i][j]=w[j]+sum(min(best[y],dp[y][j]-w[i]))(y是i的所有孩子);

哎!不是很理解,所有也就能写这么多了,在网上搜了一个详细的,大家可以参考这个poj 2152 Fire

个人代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
#define N 1010
#define M (1<<30)
struct City{
    int d,w;
}city[N];
struct lianjie{
    int child,d;
    lianjie(int x,int y)
    {
        child=x;d=y;
    }
};
vector <lianjie> tree[N];
int num,dist[N],best[N],dp[N][N];
void init()
{
    scanf("%d",&num);
    int i,u,v,l;
    for(i=1;i<=num;i++) tree[i].clear();
    for(i=1;i<=num;i++) scanf("%d",&city[i].w);
    for(i=1;i<=num;i++) scanf("%d",&city[i].d);
    for(i=1;i<num;i++)
    {
        scanf("%d%d%d",&u,&v,&l);
        tree[u].push_back(lianjie(v,l));
        tree[v].push_back(lianjie(u,l));
    }
}
void dis(int key)
{
    int length=tree[key].size();
    for(int i=0;i<length;i++)
    {
        int v=tree[key][i].child;
        if(dist[v]!=-1) continue;
        dist[v]=dist[key]+tree[key][i].d;
        dis(v);
    }
}
void dfs(int key,int parent)
{
    int i,j,v,length=tree[key].size();

    for(i=0;i<length;i++)
    {
        v=tree[key][i].child;
        if(v!=parent)        dfs(v,key);
    }
    memset(dist,-1,sizeof(dist));
    dist[key]=0;    best[key]=M;    dis(key);
    for(i=1;i<=num;i++)
    {
        if(dist[i]>city[key].d) dp[key][i]=M;
        else
        {
            dp[key][i]=city[i].w;
            for(j=0;j<length;j++)
            {
                v=tree[key][j].child;
                if(v!=parent)
                dp[key][i]+=min(best[v],dp[v][i]-city[i].w);
            }
            best[key]=min(best[key],dp[key][i]);
        }
    }
}
int main()
{
    //freopen("/home/acm/JPY/input.txt","r",stdin);
    int T;cin>>T;
    while(T--)
    {
        init();        dfs(1,0);
        cout<<best[1]<<endl;
    }
    return 0;
}


POJ2152 树形DP

题意:这一题是陈启锋的论文中
  • ahjkl007
  • ahjkl007
  • 2014年09月11日 02:10
  • 582

【poj2152】Fire 树形DP

DescriptionCountry Z has N cities, which are numbered from 1 to N. Cities are connected by highways,...
  • LOI_DQS
  • LOI_DQS
  • 2016年03月13日 15:53
  • 556

POJ 2152 Fire (树形DP,有趣)

我发现树形DP越来越有趣了……或者说树真的是一个很美妙的数据结构。 【题意】n个节点组成的树,要在树一些点上建立消防站,每个点建站都有个cost[i],每个点如果不在当前的点上建站,也要依赖其他的消...
  • AngOn823
  • AngOn823
  • 2016年08月25日 01:50
  • 432

poj2152(Fire) 树形DP

题目链接:http://poj.org/problem?id=2152 题意:一棵带边权的树,边权表示节点间距离,在i上建立消防站的代价是w[i],如果在一点i没建消防站,那么它与距离这个点最近的消...
  • xiefubao
  • xiefubao
  • 2014年06月26日 11:12
  • 676

POJ - 2152 Fire 树型DP

题目大意:有N座城市,要求在这N座城市中建一个消防系统,使得每座城市城市着火时都能被按时扑灭 现在给出每座城市建一个消防站所需的花费w和每座城市相邻消防站的最远距离lim(和该城市距离超过lim的城...
  • L123012013048
  • L123012013048
  • 2015年05月16日 14:10
  • 639

poj 2152

消防站题目描述:有n个城市,每两个城市只有一条路连接,(所以可以当成是一颗树)。现在要建设一些防火站,使每个城市都可以被覆盖。每个城市的属性是:在本城市建防火站的价钱和不在本城市建设的话,所依赖的别的...
  • u013625492
  • u013625492
  • 2015年06月16日 11:43
  • 237

[POJ2152]消防站解题报告

做这道题的时候,我一开始状态设计的太紧了,我设f(i)表示以i为根的子树自己搞定自己需要的最小代价,然后我枚举控制根的点。。然后发现转移是O(N^3)的。 看了论文之后发现其实改变一下状态就可以了,...
  • TA201314
  • TA201314
  • 2015年04月29日 17:50
  • 630

poj 2152 一道很难的树型DP

题目:poj 2152  Fire          我想说的:以前做背包的题目做多了,脑子形成了一种就是所有动态规划就是在数组上进行等一些固定的思想。结果最近在做一些题目的时候,感觉无从下手,想好...
  • jiang199235jiangJJ
  • jiang199235jiangJJ
  • 2012年07月26日 11:17
  • 2474

POJ2152 Fire

描述: Z国有N个城市,编号为从1到N。城市之间用高速公路连接,并且每两个城市之间都有唯一一条路径。最近Z国经常发生火灾,所以政府决定在一些城市修建消防站。在城市K建立消防站要花费W(K)。不同的城...
  • Programing_Excalibur
  • Programing_Excalibur
  • 2016年01月24日 20:01
  • 338

POJ 2152 树型DP //很棒的题

题意:Z国有n个城市,从1到n给这些城市编号。城市之间连着高速公路,并且每两个城市之间有且只有一条通路。不同的高速公路可能有不同的长度。最近Z国经常发生火灾,所以当地政府决定在某些城市修建一些消防站。...
  • qq_25978793
  • qq_25978793
  • 2015年10月14日 19:15
  • 251
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2152 一道很难的树型DP
举报原因:
原因补充:

(最多只允许输入30个字)