int cmp(const int i, const int j) { return w[i]<w[j]; }///间接比较函数,w[i]表示边i权值
int find_set(int x) { return p[x] == x ? x : p[x] = find_set(p[x]);}
int Kruskal(){
    int ans = 0;
    for (int i = 0; i < n; i++) p[i] = i;///初始化并查集
    for (int i = 0; i < m; i++) r[i] = i;///初始化边序号
    sort(r, r+m, cmp);///r[i]表示的是边的编号,排序根据数组存储的序号所指向的边权值进行排序
    for(int i = 0; i < m; i++){
        int e = r[i]; int x = find_set(u[e]); int y = find_set(v[e]);///找出当前边两个端点所在的集合编号
        if(x != y) { ans += w[e]; p[x] = y;}///如果在不同的集合,合并
    }
    return ans;
}