题目链接
kruskal算法
1.先对边权从小到大排序
2.每次挑选边权最小的两个顶点来判断,如果不在一个集合,就用并查集进行合并。
3.每次合并的时候记录权值,最后输出。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e3+7;
const int M = 5e4+7;
struct edge{
int u, v, w; //两个顶点和边权
}E[M];
bool cmp(edge a, edge b){
return a.w < b.w;
}
int root[N];
int find(int x){
if(x == root[x]) return x;
return root[x] = find(root[x]);
}
int main(){
int n, m, res = 0;
for(int i = 0; i < N; i++){
root[i] = i;
}
cin >> n >> m;
for(int i = 0; i < m; i++){
cin >>E[i].u >> E[i].v >> E[i].w;
}
sort(E, E + m, cmp);
for(int i = 0; i < m; i++){
int a = find(E[i].u);
int b = find(E[i].v);
if(a != b){
root[b] = a;
res += E[i].w;
}
}
cout<<res<<endl;
return 0;
}