最小生成树 · Kruskal
把所有边按权值从小到大排序,逐条尝试:两端不连通就加入(用并查集判),否则跳过(成环)。
一、互动演示:Kruskal 加边
蓝=正在看的边,绿=加入 MST,红删除线=跳过(会成环)。点“下一步”。
边已按权值排序。点“下一步”开始。
二、参考代码
sort(edges.begin(), edges.end(), cmp); // 按权值升序
init(); // 并查集初始化
int cnt = 0; long long ans = 0;
for (auto &e : edges) {
if (find(e.u) != find(e.v)) { // 两端不连通
unite(e.u, e.v); // 加入这条边
ans += e.w; cnt++;
if (cnt == n - 1) break; // 已选 n-1 条,完成
}
}
贪心正确性:每次选不成环的最小边一定安全。并查集见 并查集互动页。