算法思路
- 将每条边按权值排序
- 枚举每条边的两个点和权值,如果a,b不连通,将这条边加入集合中。(是初始时不连通,逐步加到集合中并连同,用并查集实现)
模板题代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int p[N];
int n,m;
struct Edge{
int a,b,c;
bool operator<(Edge x){//关键字排序,重载运算符
return c<x.c;
}
}edge[N];
int find(int x){
if(p[x]!=x)p[x] = find(p[x]);
return p[x];
}
int main()
{
scanf("%d%d",&n,&m);
int a,b,c;
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
edge[i] = {a,b,c};
}
sort(edge,edge+m);//时间复杂度的瓶颈O(mlogm)
int res = 0,cnt = 0;
for(int i=1;i<=n;i++)p[i] = i;
for(int i=0;i<m;i++){//枚举每条边,n是点,m是边
int x = edge[i].a,y = edge[i].b,w = edge[i].c;
x = find(x),y = find(y);
if(x!=y){
res += w;
cnt++;
p[x] = y;
}
}
if(cnt<n-1)printf("impossible\n");
else printf("%d\n",res);
return 0;
}