[NOI2011]道路修建

本文深入解析了一道关于树论的算法题目,通过代码实现展示了如何计算树中节点间的距离,并结合具体实例说明了算法的运行过程及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树论

一道大水题,直接放代码:

code:

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#define int long long 
#define half (l+r)>>1
const int maxn=2000006; 
using namespace std;
int head[maxn],cur,d[maxn],hi[maxn];
int qa[maxn],qb[maxn],qc[maxn];
struct hzw
{
    int to,next,v;
}e[maxn];
inline void add(int a,int b,int c)
{
    e[cur].to=b;
    e[cur].next=head[a];
    e[cur].v=c;
    head[a]=cur++;
}
inline void dfs(int s,int fa)
{
    d[s]=1;
    hi[s]=hi[fa]+1;
    for (int i=head[s];i!=-1;i=e[i].next)
    {
        if (e[i].to==fa) continue;
        dfs(e[i].to,s);
        d[s]+=d[e[i].to];
    }
}
inline int abs_(int x,int y)
{
    return x>y?x-y:y-x;
}
int n;
signed main()
{
    memset(head,-1,sizeof(head));
    cin>>n;
    for (int i=1,a,b,c;i<=n-1;++i)
    {
        scanf("%lld%lld%lld",&a,&b,&c);
        add(a,b,c);
        add(b,a,c);
        qa[i]=a;
        qb[i]=b;
        qc[i]=c;
    }
    dfs(1,1);
    int ans=0;
    for (int i=1;i<=n-1;++i)
    {
        int x=qa[i],y=qb[i],z=qc[i];
        int tmp=hi[x]>hi[y]?d[x]:d[y];
        ans=ans+z*abs_(tmp,n-tmp);
    }
    cout<<ans;
    return 0;
}

收获:注意马力,15分钟才切,太菜了。

转载于:https://www.cnblogs.com/bullshit/p/9656412.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值