/*选最短边开始
边都存入结构体中并按升序排序
利用并查集将各点相连
满足n-1条边,即遍历完成
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#define maxn 55
using namespace std;
int n,m,sum,cnt,cnte; //n为点的个数 m为边的个数
int f[maxn];
struct Edge{
int u,v,c;
}edge[maxn*maxn]; //可能是N*N条边
bool cmp(Edge a,Edge b){
return a.c < b.c;
}
void init(){
cnt = cnte = 0;
sum = 0;
for(int i = 1; i <= n ; i++)
f[i] = i;
}
int getf(int x){
return f[x] == x ? x : f[x] = getf(f[x]);
}
bool merge(int u,int v){
int rootu = getf(u);
int rootv = getf(v);
if(rootu != rootv){
f[rootv] = rootu;
return true;
}
return false;
}
void Kruskal(){
sort(edge,edge+m,cmp);
for(int i = 0 ; i < m; i++){
if(merge(edge[i].u,edge[i].v)){
sum += edge[i].c;
cnte++;
}
if(cnte == n-1) break;
}
}