P2052 [NOI2011]道路修建——树形结构(水题,大佬勿进)

P2052 [NOI2011]道路修建

 

这个题其实在dfs里面就可以把事干完的,(我一开始还拿出来求了一把)……

一条边的贡献就是儿子的大小和n-siz[v]乘上边权;

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
int pre[maxn*2],last[maxn],other[maxn*2],len[maxn*2],l;
void add(int x,int y,int z)
{
    l++;
    pre[l]=last[x];
    last[x]=l;
    other[l]=y;
    len[l]=z;
}

int n;
int father[maxn];
int siz[maxn];
ll ans;

void dfs(int x,int fa)
{
    siz[x]=1;
    for(int p=last[x];p;p=pre[p])
    {
        int v=other[p];
        if(v==fa) continue;
        dfs(v,x);
        ans+=(ll)abs(n-2*siz[v])*len[p];
        siz[x]+=siz[v];
    }
}



int main()
{
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
        add(b,a,c);
    }
    dfs(1,1);
    printf("%lld",ans); 
    return 0;
}
View Code

 

posted @ 2019-10-29 07:59  AiRomance  阅读(151)  评论(0编辑  收藏  举报