无向图基本算法 -- 遍历及最小生成树算法

1. 无向图图的表示

2. 无向图遍历算法

3. 最小生成树算法

4. 代码下载

1. 无向图表示

下面的代码中使用的无向图的表示方法和有向图中表示相同。如下:

 

2.无向图遍历算法

无向图的遍历算法和有向图是类似,具体可以常见上一篇有向图的介绍。 

3. 最小生成树算法

 3.1 基本概念

 在表示最小生成树之前,首先定义最小生成树。设图G= (V, E),对于其中的每条边(u, v) 属于E,定义函数w(u, v)为连接u和v的代价,定义最小生成树T(E的子集),T连接所有的顶点,并且权值最小。

 

3.2 算法思想

最小生成树的基本算法采用“贪心策略”。我们初始化一个集合T,然后在每次迭代保证向T中加入边后,A仍然能够保证最小特性。算法的思想基本如下:

 

那么现在剩下了一个问题,如何得到上面算法中的(u, v),保证A仍然是最小生成树的一部分。这里用到了“割”的概念。无向图G=(V, E)的一个割是V的一个划分,如下。

 

如果一条边是通过某个“割”的所有边的最小边的话,就是我们上面寻找的(u, v)。 下面的两种算法Krukal和Prim算法都是对上面算法思想的具体实现。

3.3 Krukal算法

 

Krukal算法首先通过对图中的所有边递增排序,检查顶点u和v是否属于同一棵树,如果不是将u和v合并,最终形成最小生成树。对于下面的无向图生成算法顺序如下:

 

 

 

3.4 Prim算法 

个人感觉Prim算法相对于上面算法是比较好理解的。该算法首先从一个顶点开始,寻找还未在最小生成树中的顶点,并且该顶点对于该最小生成树是“安全”的,将该顶点添加到最小生成树中。伪代码如下:

 

这里面需要注意的是上面需要使用最小优先级队列Q,由于在.net类库中不存在相应的模板类,需要自己实现,可以使用这个版本:/Files/xuqiang/PriorityQueue.rar

4. 代码下载 

 /Files/xuqiang/UnDirectedGraphTest.rar

posted @   qiang.xu  阅读(5266)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示