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

时间:2021-09-06 11:39:44

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