hdu4424 并查集+贪心

本文介绍了一种解决树形结构中寻找最佳中心点的问题,通过最大化最小边权重来优化货物流通能力。采用并查集维护子树状态,并在合并过程中更新中心位置,确保高效的路径选择。

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

题意:有一棵树,树上任意亮点容量的定义是路径上的最小边的大小,然后要选定一个中心,问最多货物能运送多少


解法:由于是最小边再进行限制,那么我们就要使得当前最小边最大,然后用并查集维护两个点之间的中心所在位置

当两个子树进行合并的时候,选择当前能够流通货物最多的一侧作为中心就可以了


注意要使用I64d啊 原来这个还会导致TLE

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define LL __int64
#define maxn 222222
struct edge{
    int u,v;
    LL w;
}e[maxn];
bool cmp(edge x,edge y){return x.w>y.w;}
int n,f[maxn],co[maxn];
LL va[maxn];
int scan()
{
    int res=0,ch;
    while(!((ch= getchar())>='0'&&ch<='9')){
        if(ch==EOF)return 1<<30;
    }
    res=ch-'0';
    while((ch=getchar())>='0'&&ch<='9')
        res=res*10+(ch-'0');
    return res;
}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
int main(){
    while(~scanf("%d",&n)){
        LL ans=0;
        for(int i=0;i<n-1;++i){
            e[i].u=scan();e[i].v=scan();
            scanf("%I64d",&e[i].w);
        }
        for(int i=1;i<=n;++i){co[i]=1;va[i]=0;f[i]=i;}
        sort(e,e+n-1,cmp);
        int x,y;
        for(int i=0;i<n-1;++i){
            x=find(e[i].u);y=find(e[i].v);
            LL tmpu=co[x]*e[i].w+va[y];
            LL tmpv=co[y]*e[i].w+va[x];
            ans=max(tmpu,tmpv);
            if(tmpu>tmpv){
                va[x]=tmpu;
                co[x]+=co[y];
                f[y]=x;
            }else {
                va[y]=tmpv;
                co[y]+=co[x];
                f[x]=y;
            }
        }
        printf("%I64d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值