POJ 2152 Fire(树形DP)

本文详细解析了POJ 2152消防站问题的解决思路,通过定义状态F[i][j]表示从节点i出发,覆盖j个节点的最小成本,以及Best[i]表示以i为根节点的所有节点都找到负责消防站的最小费用。使用深度优先搜索算法计算各节点到根节点的距离,并结合动态规划求解最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

题意:

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

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

int n,w[N],d[N];
vector<pair<int,int> > g[N];
int f[N][N],dis[N],best[N];

void dfs(int u)
{
    int i,v;
    FOR0(i,SZ(g[u]))
    {
        v=g[u][i].first;
        if(dis[v]!=-1) continue;
        dis[v]=dis[u]+g[u][i].second;
        dfs(v);
    }
}

void DFS(int u,int pre)
{
    int i,j,v;
    FOR0(i,SZ(g[u]))
    {
        v=g[u][i].first;
        if(v!=pre) DFS(v,u);
    }
    clr(dis,-1); dis[u]=0; dfs(u);
    FOR1(i,n) f[u][i]=INF;
    best[u]=INF;
    FOR1(i,n) if(dis[i]<=d[u])
    {
        f[u][i]=w[i];
        FOR0(j,SZ(g[u]))
        {
            v=g[u][j].first;
            if(v==pre) continue;
            f[u][i]+=min(best[v],f[v][i]-w[i]);
        }
        best[u]=min(best[u],f[u][i]);
    }
}

int main()
{
    rush()
    {
        RD(n);
        int i;
        FOR1(i,n) RD(w[i]);
        FOR1(i,n) RD(d[i]);
        FOR1(i,n) g[i].clear();
        FOR1(i,n-1)
        {
            int u,v,w;
            RD(u,v,w);
            g[u].pb(MP(v,w));
            g[v].pb(MP(u,w));
        }
        DFS(1,0);
        PR(best[1]);
    }
}

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值