构造完全图
题目链接:构造完全图
题目描述

解题思路
我们可以这样想:最小生成树就是在并查集的时候两个并查集中最小的一条边,那么其他的边就一定大于它。为了使和最小,我们把除了选择的边以外的全部赋为 d i + 1 d_i+1 di+1 ,再累加即可。
code
#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
int n,ans=0;
int fa[100010];
int num[100010];
struct abc{
int x,y,z;
}a[100000];
bool cmp(abc a,abc b)
{
return a.z<b.z;
}
int fd(int now)
{
if(fa[now]==now)
return now;
return fa[now]=fd(fa[now]);
}
signed main()
{
cin>>n;
for(int i=1;i<n;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
sort(a+1,a+n,cmp);
for(int i=1;i<=n;i++)
fa[i]=i,num[i]=1;
for(int i=1;i<n;i++)
{
int fx=fd(a[i].x);
int fy=fd(a[i].y);
if(fx!=fy)
{
fa[fx]=fy;
ans+=(num[fy]*num[fx]-1)*(a[i].z+1)+a[i].z;
num[fy]+=num[fx];
}
}
cout<<ans<<endl;
}
1万+



被折叠的 条评论
为什么被折叠?



