返回首页

Prim:堆优化实现最小生成树

一、面试常考点

1. Prim 核心思路

从任意点出发,每次选择连接“已选点集合”和“未选点集合”的最小边。

2. 与 Kruskal 区别

Prim 更偏点扩展,Kruskal 更偏边筛选。

二、细节介绍

1. 适用性

稠密图常用 Prim;稀疏图两者都常见。

2. 堆优化

最小堆维护候选边,降低选边成本。

三、示例代码(思路版)

function prim(n, graph) {
  const inMST = Array(n).fill(false)
  const dist = Array(n).fill(Infinity)
  dist[0] = 0
  let ans = 0

  for (let i = 0; i < n; i++) {
    let u = -1
    for (let v = 0; v < n; v++) {
      if (!inMST[v] && (u === -1 || dist[v] < dist[u])) u = v
    }
    if (dist[u] === Infinity) return -1

    inMST[u] = true
    ans += dist[u]

    for (let v = 0; v < n; v++) {
      if (!inMST[v]) dist[v] = Math.min(dist[v], graph[u][v])
    }
  }

  return ans
}

四、常用应用场景

1. 图基础设施建设

站点逐步接入成本最小化。

2. 动态扩展网络

从核心节点向外增量扩展。