poj 2152 Fire

题目链接:http://poj.org/problem?id=2152

题目大意:在一棵树形的城市中建立一些消防站,但每个城市有一个最大距离限制,求需要的最小花费。

题目思路:树形dp,定义dp[i][j]为以i为根的子树且i的消防站建在j的最小花费,best[i]为以i为根的子树的最小花费,则dp[i][j]=w[j]+sum(min(dp[child][j]-w[j],best[child]));

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define inf 0x3f3f3f3f
#define Max 110
int max(int a,int b)
{
	return a>b?a:b;
}
inline int min(int a,int b)
{
	return aD[u])
            continue;
        dp[u][i]=w[i];
        for(j=p[u];j!=-1;j=e[j].next)
        {
            int v=e[j].to;
            if(v!=pre)
            dp[u][i]+=min(best[v],dp[v][i]-w[i]);
        }
     //   printf("u %d i %d dp %d\n",u,i,dp[u][i]);
        best[u]=min(best[u],dp[u][i]);
    }
}
int main()
{
    int i,j,k,u,v,len;
    scanf("%d",&t);
    while(t--)
    {
        eid=0;
        memset(p,-1,sizeof(p));
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            scanf("%d",&w[i]);
        for(i=1;i<=n;i++)
            scanf("%d",&D[i]);
        for(i=1;i


你可能感兴趣的:(poj 2152 Fire)