DK 有一个无向图 G,这个无向图有 n 个点 m 条边
参考出题人的题解:
可以发现,对答案有贡献的边肯定是最大生成树上的边,那么可以将这些边先拉出来,用kural算法求最大生成树即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
struct Node{
int u,v,val;
friend bool operator <(const Node& a,const Node& b)
{
return a.val>b.val;
}
}a[500010];
int f[500010];
int Find(int x)
{
if(f[x]==x) return x;
else return f[x]=Find(f[x]);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
int u,v,val;
priority_queue<Node> p;
for(int i=1;i<=n;++i) f[i]=i;
for(int i=1;i<=m;++i)
{
cin>>a[i].u>>a[i].v>>a[i].val;
}
sort(a+1,a+1+m);
int k=0;
ll ans=0;
for(int i=1;i<=m;++i)
{
if(k>=n-1) break;
int ur=Find(a[i].u);
int vr=Find(a[i].v);
if(ur!=vr)
{
++k;
f[ur]=vr;
ans+=a[i].val;
}
}
cout<<ans<<endl;
return 0;
}