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; }
浙公网安备 33010602011771号