#define MAXN 1005
#define INF 0x3f3f3f3f
// 并查集
class DSU {
public:
DSU(int n) {...}
int find(int x) {...}
void merge(int x, int y) {...}
};
struct Edge {
int u; // 起点
int v; // 终点
int w; // 权值
bool operator<(const Edge &other) {
return w < other.w;
}
};
Edge G[MAXN]; // 边集数组
int n; // 顶点数
int m; // 边数
int kruskal() {
DSU dsu(n); // 定义并查集
sort(G, G + m); // 所有边从小到大排序
int ans = 0; // 记录MST的权值
int cnt = 0; // 记录当前已经使用的条的数目
for(int i = 0; i < m; i++) {
int u = G[i].u;
int v = G[i].v;
int w = G[i].w;
if(dsu.find(u) == dsu.find(v)) continue; // 这条边无助于生成MST
dsu.merge(u, v); // 合并两条个顶点
ans += w; // 更新权值
cnt++; // 更新已使用的边的数目
// 还可以把使用过的边保存起来,以得到最后的MST
if(cnt == n-1) { // 边的数目达到顶点数减1时,表示MST已构建完成
break;
}
}
return ans;
}