洛谷1131 [ZJOI2007]时态同步

算法竞赛 算法-搜索
编辑文章

日推水题系列。

对于每一个子树,每个叶节点对答案的贡献就是 根到所有叶节点距离的最大值 $dismax$ 减去 根到这个叶节点的距离 $dis[x]$。直接dfs即可。

注意要开long long,我又被坑了一次。

struct Edge{
    ll next,to,w;
} edge[1000005];
ll head[500005],cnt,n,m,s,a,b,c,dis[500005],ans;

inline void add(ll u,ll v,ll w)
{
    edge[++cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt;
}

void dfs(ll x,ll f)
{
    ll siz=0;
    for (ll i=head[x];i;i=edge[i].next)
    {
        ll y=edge[i].to,w=edge[i].w;
        if (y==f) continue;
        dfs(y,x);
        if (dis[y]+w>dis[x])
        {
            ans+=siz*(dis[y]+w-dis[x]);
            dis[x]=dis[y]+w;
        }
        else ans+=dis[x]-dis[y]-w;
        siz++;
    }
    return;
}

int main()
{
    n=read(); s=read();
    for (ll i=1;i<n;i++)
    {
        a=read(); b=read(); c=read();
        add(a,b,c);
        add(b,a,c);
    }
    dfs(s,0);
    printf("%lld",ans);
    return 0;
}

新评论

称呼不能为空
邮箱格式不合法
网站格式不合法
内容不能为空