计蒜客习题-蒜头君的建设方案

直接dfs算size

 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
const int maxn=1000007;
struct edge{
    int v,nxt,w;
}e[maxn<<1];
int p[maxn],eid=0,size[maxn],n;
/*
其实只要求出num_a(i) 就能算另一边的num 就是n-num_a(i) 
w_i就等于length_i*abs(2*num_a(i)-n)
*/
bool vis[maxn];
typedef long long ll;
ll ans=0;
inline int read(){
        int s=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
        while(c>='0'&&c<='9') {s=s*10+c-'0';c=getchar();}
        return s*f;
}
inline void ins(int u,int v,int c){
    e[eid].v=v;e[eid].w=c;e[eid].nxt=p[u];p[u]=eid++;
    e[eid].v=u;e[eid].w=c;e[eid].nxt=p[v];p[v]=eid++;
}
inline void init(){memset(p,-1,sizeof(p));eid=0;}
void dfs(int x){
    size[x]=1;
    for(int i=p[x];~i;i=e[i].nxt){
        int v=e[i].v;
        if(vis[v]) continue;
        vis[v]=true;
        dfs(v);
        size[x]+=size[v];
        ans+=(ll)abs((size[v]<<1)-n)*e[i].w;
    }
}
int main(){
    n=read();
    int s,t,c;
    init();
    for(int i=1;i<n;i++){
        s=read();t=read();c=read();
        ins(s,t,c);
    }
    vis[1]=true;
    dfs(1);
    cout<<ans;
    return 0;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值