最小生成树问题简单地说就是在有N个结点的图中寻找能连接n个结点的n-1条边,使总的代价最小。
构造构造最小生成树有两个典型的算法,prim算法和Kruskal算法。
prim算法思想:
假设N={V,{E}}是联通网,TE是N上最小生成树中边的集合。算法从U={u}(u在v中),TE={}开始,重复执行以下操作:在所有的U和V中相连接的边中寻找一条代价最小的边(u,v)加入TE中,同时将u加入到U中,知道U=V为止。此时TE中必有n-1条边,则T={V,{TE}}为N的最小生成树。
此程序的几个关键点:
1、使用辅助数组closedge记录从U中到V-U中代价最小的边。(即V-U中的结点到U中哪个结点的代价最小)
2、V表示图的全部结点的集合,当有结点已经用于生成最小生成树后把结点加入U中,cloaedge的lowcost为0表示结点在U中
3、图用邻接表存储时,要注意在每一次将节点加入U过程后对closedge中lowcost的更新。要设置一个标志,表示在当前过程该节点的lowcost是否已经被更新过,如果已经被更新过,则不再被更新。
图中弧的信息可以采用邻接表存储也可以采用二维数组数组存储,由于此矩阵是对称的,因此我们可以用上三角矩阵或下三角矩阵来存储图中弧的信息。此算法实现时,图中弧的信息用数组存储比用邻接表存储稍微简单一点,因为在修改closedge中元素的代价时我们可以直接在数组中查找而不用使用指针,但是用邻接表存储时查找效率会比数组高。
以下分别用数组和邻接表存储图中弧的信息时的代码,第一个为用邻接表存储,第二个为用数组存储。
#include <iostream>
#define ERROR 1;
typedef char VertexType;
typedef int InfoType;
typedef int VRType;
using namespace std;
typedef struct ArcNode{
int adjvex; //图中的弧所依附的顶点的编号
InfoType weight; //弧上所带的权值
struct ArcNode *nextarc; //指向下一条弧的指针
}ArcNode;
typedef struct VNode{
VertexType data; //弧中结点的值
ArcNode *firstarc;