GESP8 · 图论

最小生成树 · 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 条,完成
    }
}

贪心正确性:每次选不成环的最小边一定安全。并查集见 并查集互动页