Kruskal
int n, m; // 顶点和边数
int u[100], v[100], w[100]; // 边顶点和权重
int r[100]; // 边权重从小到大的下标
int pa[100]; // 并查集所用
void read(){
cin >> n >> m;
for(int i = 0; i < m; i++){
int x, y, z;
cin >> x >> y >> z;
u[i] = x;
v[i] = y;
w[i] = z;
}
}
// 查找u的根节点(所属集合)
int find(int u){
return u == pa[u] ? u : pa[u] = find(pa[u]);
}
bool cmp(const int &a, const int &b){
return w[a] < w[b];
}
int kruskal(){
// 初始化r
for(int i = 0; i < m; i++){
r[i] = i;
}
sort(r, r + m, cmp); // 按给定比较函数排序
// 初始化并查集
for(int i = 0; i < n; i++){
pa[i] = i;
}
int ans = 0; // 最小生成树的权重
for(int e = 0; e < m; e++){
int x = u[e], y = v[e], z = w[e];
int p1 = find(x), p2 = find(y);
if(p1 != p2){
ans += z;
pa[p1] = p2;
}
}
return ans;
}