题目链接:最小生成树二·Kruscal算法
题目大意:给你一张无向带权图,求最小生成树
题目思路:采用kruskal算法做,具体算法讲解参见我的B站算法讲堂:算法讲堂
时间复杂度&&空间复杂度:O(MlogM + M * Ackermann’(M)))&&O(max(m,n))(n为点的个数,m为边的个数)
#include <map>
#include <set>
#include <cmath>
#include <stack>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
int pre[maxn];
struct edge{
int from,to,val;
}Edge[maxn];
bool cmp(edge x,edge y){
return x.val < y.val;
}
int Find(int x){
return x == pre[x]?x:pre[x] = Find(pre[x]);
}
void Union(int x,int y){
pre[Find(x)] = Find(y);
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i = 0;i <= n;i++) pre[i] = i;
for(int i = 1;i <= m;i++){
scanf("%d%d%d",&Edge[i].from,&Edge[i].to,&Edge[i].val);
}
sort(Edge+1,Edge+1+m,cmp);
int ans = 0;
for(int i = 1;i <= m;i++){
if(Find(Edge[i].from) != Find(Edge[i].to)){
Union(Edge[i].from,Edge[i].to);
ans += Edge[i].val;
}
}
printf("%d\n",ans);
return 0;
}