【洛谷P1131】时态同步

本文深入探讨树形动态规划的原理与应用,通过解决树结构上的问题,讲解如何正确处理子树信息,避免直接忽略非根节点可能导致的错误解法。文章提供了详细的算法思路与C++代码实现。

背景:stu-49不是个好stu,听一下午树形DP毛都不会写。

链接

显然这是棵树

首先声明,我会说两种想法,第一个想法是错误的,第二个想法是正解。

第一个:

考虑直接从根走,len [ u ] 表示从根到结点u的路径长度,取个max表示 max { dis[u][son[u] };

ans=\sum_{u \epsilon leaves}max- len[u]

(以上为假式子)

这个做法显然是错的,因为我们只处理了根节点,而对于任意一个非根非叶结点,它与其子树是一个子问题,极有可能产生更优的答案,而我们直接忽略了,所以哇的很惨惨。

第二个:

树形DP。

第一个算法虽然不对,但是基本策略是对的,就是  1)在子树中找到最大值  2)答案的累加。

我们为了避免第一个的弊端,要考虑全所有子树。

先考虑最下层结点,是边界,不管了。

倒数第二层,它对答案的贡献就是ans[u]=\sum_{v \epsilon son[u]} max(dis[u][v])-len[u]

(假公式)

第三层呢?

第二层的子树已经处理了,不用管了。可以将第二层子树缩成一个节点 x,它需要表示出子树的深度。

原来父子的连边长度加上子树处理后的深度即可。这样第三层就成了一个“第二层”的问题,就过了。

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<queue>
#define maxn 500005
using namespace std;
int n,s;
int head[maxn];
struct node
{
    int x,y,nxt;
    long long z;
}e[maxn*2];
int tot=0;
int x,y;
long long z;
inline void ad(int x,int y,long long z)
{
    ++tot;
    e[tot].x=x;e[tot].y=y;e[tot].z=z;e[tot].nxt=head[x];head[x]=tot;
}
long long ans=0;
long long mx[maxn];
void dfs(int u,int fa)
{
    for(int i=head[u];i;i=e[i].nxt)
        if(e[i].y!=fa)
            dfs(e[i].y,u);//1.递归处理
            
    for(int i=head[u];i;i=e[i].nxt)
        if(e[i].y!=fa)
            mx[u]=max(mx[u],e[i].z);//2.可以先看作对于“第二层”问题的处理
    
    for(int i=head[u];i;i=e[i].nxt)
        if(e[i].y!=fa)
            ans+=mx[u]-e[i].z;//3.统计答案
    for(int i=head[fa];i;i=e[i].nxt)
        if(e[i].y==u)
        {
            e[i].z+=mx[u];
            break;
        }//4.将节点至于最深处,这样回到2就又是一个第二层的问题了。
    
}
int main()
{
    scanf("%d%d",&n,&s);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d%lld",&x,&y,&z);
        ad(x,y,z);
        ad(y,x,z);
    }
    dfs(s,s);
    printf("%lld",ans);
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值