题解|《算法竞赛进阶指南》 走廊泼水节

A-走廊泼水节_0x62 图论-最小生成树

https://ac.nowcoder.com/acm/contest/1056/A

题解

我们先按Kruskal在已经给出的最小生成树模拟,每次按边权从小到大对联接的两个块操作

一步一步合并节点,每次两个完全图集合互相合并成一个完全图集合时,ans要加上(这条路最小权值+1)(集合一的点数集合二的点数-1)

码量较小,主要考察思维

#include<bits/stdc++.h>
using namespace std;
struct edge{
    int x,y,w;
};
const int maxn=50010;
int fa[maxn],s[maxn];
edge a[maxn];
bool cmp(const edge &a,const edge &b){
    return a.w<b.w;
}
int father(int x){
    if(fa[x]==x) return x;
    fa[x]=father(fa[x]);
    return father(fa[x]);
}
int main(){
    int t;
    int x,y,w,n;
    scanf("%d",&t);
    while(t--){
        int ans=0;
        scanf("%d",&n);
        for (int i=0;i<=n;i++) fa[i]=i,s[i]=1;
        for (int i=1;i<=n-1;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
        sort(a+1,a+n,cmp);
        for(int i=1;i<=n-1;i++)
        {
            int x=father(a[i].x);
            int y=father(a[i].y);
            if(x==y) continue;
            ans+=(a[i].w+1)*(s[x]*s[y]-1); 
            fa[x]=y;
            s[y]+=s[x];
        }
        printf("%lld\n",ans);
    }
    return 0;
}
全部评论

相关推荐

_mos_:忍耐王
点赞 评论 收藏
分享
门口唉提是地铁杀:之前b站被一个游戏demo深深的吸引了。看up主页发现是个初创公司,而且还在招人,也是一天60。二面的时候要我做一个登录验证和传输文件两个微服务,做完要我推到github仓库,还要我加上jaeger和一堆运维工具做性能测试并且面试的时候投屏演示。我傻乎乎的做完以后人家跟我说一句现在暂时不招人,1分钱没拿到全是白干
你的秋招第一场笔试是哪家
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-27 14:11
很喜欢小米的新车,校招薪资每月22k,攒多久能买?
测试糕手手:别看工资,先看现金流存款。有50W存款以上再考虑,车是消耗品,选适合自己的重要。你有钱就当我没说过
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务