[NOI2011]道路修建

树上计算size模拟算答案。
Luogu

#include <cstdio>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const int maxm=1100000;
int head[maxm],net[maxm*2],to[maxm*2],cnt;
ll ans=0,cost[maxm*2],n;
inline void add(int x,int y,ll c)
{
    to[++cnt]=y;
    cost[cnt]=c;
    net[cnt]=head[x];
    head[x]=cnt;
}
ll absx(ll x)
{
    if(x<0) return -x;
    return x;
}
ll dfs(int now,int fax)
{
    ll size=1,k=2;
    for(int i=head[now];i;i=net[i])
    if(to[i]!=fax)
    {
        ll d=dfs(to[i],now);
        size+=d;
        ans+=absx(n-k*d)*(ll)cost[i];
    }
    return size;
}
int main()
{
    scanf("%lld",&n);
    for(int i=1;i<n;i++)
     {
        int u,v;
        ll c;
        scanf("%d%d%lld",&u,&v,&c);
        add(u,v,c),add(v,u,c);
     }
    dfs(1,0);
    return printf("%lld",ans)*0;
}
    原文作者:道路修建问题
    原文地址: https://blog.csdn.net/qq_35914587/article/details/79147440
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞