学习首页/图算法/Kruskal 最小生成树交互演示 · JavaScript

代码与动画 KRUSKAL · MST

Kruskal 最小生成树.

按权重尝试连接两个分量,使用并查集排除形成环的边。

时间 O(E log E + Eα(V))空间 O(V + E)无向带权图

原理与执行逻辑

按权重从小到大检查无向边,优先连接尚未连通的两个分量。并查集判断两端是否已经连通,避免选入形成环的边。

执行步骤

  1. 每个顶点初始化为独立集合,将边按权重排序。
  2. 查找当前边两端的集合代表。
  3. 代表相同时跳过;不同时选边,并按集合大小合并。
  4. 扫描结束后输出总权重与选中边;不连通图得到最小生成森林。

关键理解

选中的边始终无环。连接当前两个分量的最小可用边可以加入某棵最小生成树;并查集记录连通关系,不负责比较权重。

简短示例

A-B 权重 1、B-C 权重 2、A-C 权重 4。先选前两条,总权重 3;最后一条的两端已连通,跳过。

代码与执行动画

STEP 0 / 15
Kruskal 最小生成树
function kruskal(vertices, edges) {  const parent = Object.fromEntries(vertices.map(v => [v, v]));  const size = Object.fromEntries(vertices.map(v => [v, 1]));  function find(v) { if (parent[v] !== v) parent[v] = find(parent[v]); return parent[v]; }  const result = []; let cost = 0;  for (const edge of [...edges].sort((a, b) => a.weight - b.weight)) {    let a = find(edge.from), b = find(edge.to);    if (a === b) continue;    if (size[a] < size[b]) [a, b] = [b, a];    parent[b] = a; size[a] += size[b];    result.push(edge); cost += edge.weight;  }  return {edges: result, cost};}
14 行 · 0 个片段标记
累计权重 0分量 6
1122347A代表 AB代表 BC代表 CD代表 DE代表 EF代表 F
当前数据正在操作已访问 / 命中标记 / 指针
0

排序所有边

按权重从小到大检查,初始每个顶点是独立分量。

配置演示数据

应用后重新生成执行过程,可单步观察结果。

实现说明

Kruskal 最小生成树的操作规则

固定顶点 A–F,采用路径压缩与按大小合并。图不连通时输出最小生成森林,并标出分量数量;重复无向边保留最小权重。

对应题目与扩展练习

观察执行过程后,按题目约束调整输入、返回值与实现。链接打开官方题目页面。