背景
我们上一篇图文介绍了 如何利用 C# 实现 Kruskal 最小生成树算法?,Kruskal 算法通过寻找边最优的方式来构造最小生成树,本篇图文介绍如何利用 C# 实现 Prim 最小生成树算法,Prim 算法通过寻找顶点最优的方式来构造最小生成树。
在继续介绍 Prim 算法之前,我整理了以前发布的有关数据结构与算法的图文,建个索引以方便大家的复习啊。
线性结构
- 如何利用“栈”解决“出轨”问题?
- 如何利用“队列”解决“窗口混乱”问题?
- 字符串的模式匹配算法
树形结构
- 如何利用C#实现Huffman编码?
排序相关
- 8大排序算法之:直接插入排序
- 8大排序算法之:希尔插入排序
- 8大排序算法之:直接选择排序
- 8大排序算法之:堆选择排序
- 8大排序算法之:冒泡排序
- 8大排序算法之:快速交换排序
- 8大排序算法之:并归排序
- 8大排序算法之:桶排序
搜索相关
- 8大搜索算法之:顺序搜索
- 8大搜索算法之:二分搜索
- 8大搜索算法之:插补搜索
- 8大搜索算法之:二叉搜索树(上)
- 8大搜索算法之:二叉搜索树(中)
- 8大搜索算法之:二叉搜索树(下)
- 8大搜索算法之:AVL树(上)
- 8大搜索算法之:AVL树(中)
- 8大搜索算法之:AVL树(下)
- 8大搜索算法之:红黑树(上)
- 8大搜索算法之:红黑树(中)
- 8大搜索算法之:红黑树(下)
LeetCode 实战
- LeetCode实战:旋转链表
- LeetCode实战:相同的树
- LeetCode实战:对称二叉树
- LeetCode实战:删除链表的倒数第N个节点
- LeetCode实战:合并两个有序链表
- LeetCode实战:两两交换链表中的节点
技术分析
Prim 算法:
例子:
该例子演示了一个含有6个结点,10条边的联通网,通过 Prim 算法从 V0 点开始逐步演化为含有6个结点,5条边的连通子网的过程,即构造最小生成树的过程。
代码实现
我们利用邻接表的方式来存储图的结构。有关于边表 EdgeNode、顶点表 VertexNode 和图 AdGraph 的结构,参见 如何利用 C# 实现 Kruskal 最小生成树算法? 中的 Step1、Step2 和 Step3。
上面例子,在内存中的邻接表结构为:
最小生成树的节点结构 SpanTreeNode,参见 如何利用 C# 实现 Kruskal 最小生成树算法? 中的 Step4。
有了以上的基础,我们就可以写 Prim 算法了。
public SpanTreeNode[] MiniSpanTree(string vName){ int i = GetIndex(vName); if (i == -1) return null; SpanTreeNode[] spanTree = new SpanTreeNode[VertexCount]; //首先加入根节点 spanTree[0] = new SpanTreeNode(_vertexList[i].VertexName, "NULL