“Prim 算法维护一棵活动树及外部顶点键,Kruskal 维护许多分量与全局边序。Borůvka 算法则每轮为所有分量并行挑选最轻出边并收缩。若图持续插删边,删除一条已选边会要求在线寻找替代…”
形式陈述
给定连通有限无向带权图
若键严格减小,同时记录该边的 ID 和
正确性不变量是
键由最小优先队列维护。设
- 邻接表加带句柄二叉堆执行
次extract-min、至多 次边检查和 次有效decrease-key,最坏时间 ;连通且 时可简写为 ,辅助空间 ; - 惰性插入新键而不做
decrease-key时,从单个根记录开始,总插入数至多 ,时间为 、空间为 ; - Fibonacci 堆的摊还操作界给出整个算法确定性最坏总时间
; - 邻接矩阵配合长度为
的键数组,每轮线性寻找最小键,总时间 、辅助空间 (不计矩阵)。
直觉
Prim 只生长一个连通块。外部顶点的键不表示它离根有多远;它记录“现在把该点接入树的最便宜单边”。每次接入后,只有新顶点的邻边可能改善其他键,因此无需反复扫描整个割。
它与 Dijkstra 都可写成“取最小键、扫描邻边”,但两个键的代数含义不同。Dijkstra 用
例子与边界
设边及权重为
从
相等权边可能给出多棵 MST,起点与平局规则只改变具体输出,不改变最小总权。负权边会优先接入,但不破坏割性质。平行边应分别比较,外部顶点只保留其中当前最轻的一条及其边 ID;自环永远不跨割,应忽略。
单次 Prim 只能覆盖根所在连通分量。若优先队列最小键变为
推论与应用
图表示决定 Prim 能否只扫描真实邻边。稠密显式图中,
Kruskal 算法从许多单点分量出发,按全局边序逐渐合并;Prim 始终只有一棵活动树。Borůvka 算法又让所有分量并行选择出边。三者共享割性质,但 Prim 的键更新、Kruskal 的排序和 Borůvka 的轮收缩不能互换复杂度结论。
参考资料
- Robert C. Prim, “Shortest Connection Networks and Some Generalizations,” Bell System Technical Journal 36(6), 1957, pp. 1389–1401。
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,§21.2。
- Jon Kleinberg and Éva Tardos, Algorithm Design, Pearson, 2005,§4.5。