返回首页

Kruskal:并查集实现最小生成树

一、面试常考点

1. Kruskal 核心步骤

边按权重排序,依次尝试加入,若成环则跳过。

2. 成环判断

并查集判断两个端点是否已在同一集合。

二、细节介绍

1. 复杂度

排序 O(E log E),并查集近似常数合并查询。

2. 停止条件

已选边数达到 n-1

三、示例代码

function kruskal(n, edges) {
  edges.sort((a, b) => a[2] - b[2])
  const parent = Array.from({ length: n }, (_, i) => i)

  function find(x) {
    if (parent[x] !== x) parent[x] = find(parent[x])
    return parent[x]
  }

  function union(a, b) {
    const pa = find(a)
    const pb = find(b)
    if (pa === pb) return false
    parent[pa] = pb
    return true
  }

  let cost = 0
  let used = 0
  for (const [u, v, w] of edges) {
    if (union(u, v)) {
      cost += w
      used++
      if (used === n - 1) break
    }
  }

  return used === n - 1 ? cost : -1
}

四、常用应用场景

1. 网络布线最小成本

机房、园区、城市路网。

2. 聚类预处理

作为层次聚类的图结构基础。