学好并查集很重要QAQ
kruskal就是把边按权值大小排序,再用并查集连接节点而成的
#include <bits/stdc++.h>
using namespace std;
struct Edge{
int v1, v2, w;
};
bool cmp(Edge e1, Edge e2){
return e1.w < e2.w;
}
int par[5005];
int find(int x){
if(x == par[x])
return x;
par[x] = find(par[x]);
return par[x];
}
bool is_connected(int x, int y){
return find(x) == find(y);
}
void connect(int x, int y){
int a = find(x);
int b = find(y);
par[a] = b;
}
int main()
{
int n,m;
int num = 0, ans = 0; //边数,生成树权值和
cin >> n >> m;
Edge a[200005];
for (int i = 0; i < m; ++i) {
scanf("%d %d %d", &a[i].v1, &a[i].v2, &a[i].w);
}
sort(a,a+m,cmp);
for (int i = 1; i <= n; ++i) {
par[i] = i;
}
for (int i = 0; i < m; ++i) {
int v1 = a[i].v1;
int v2 = a[i].v2;
int w = a[i].w;
if(!is_connected(v1,v2)){
connect(v1,v2);
ans += w;
num++;
}
}
if(num < n-1){ //生成树至少要有n-1条边
cout << "orz" << endl;
}
else{
cout << ans << endl;
}
return 0;
}