这是前不久写的实验程序,最小生成树。现在将主要算法发上,如谁需要完整源代码,可以直接在这下面留言,留下邮箱地址,联系我:neuwjyou@163.com QQ:421068480
1、图的数据类型定义:采用邻接矩阵结构。
typedef enum{ DG,DN,UDG,UDN }GraphKind;//图的类型:有向、有网,无向、无网
typedef struct{ //在最小生成树是的辅助存储结构
int adjvex;
int lowcost;
}Edge;
typedef struct Graph{ //图结构,这里采用邻接矩阵存储结构
int arcnum;//边的数目
int vexnum;//顶点数目
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//图的弧线
VexType vexs[MAX_VERTEX_NUM];//顶点
GraphKind kind;
}Graph;
相应的操作函数说明:
Status CreateGraph(Graph &G);
创建图,这这个程序中,将图结构有程序生成。
int LocateVex(Graph G,char v);
查找定点v在图中的位置
Status PrintVex(Graph G,VexType v1,VexType v2);
输出生成树的边,即v1 与 v2 的边
Status MiniSpanTree(Graph G,VexType v);
生成最小生成树核心算法,
1、创建图,这里将图结构在程序里自动生成,不用用户来输入生成,这里最要是演示最小生成树的生成过程。
Status CreateGraph(Graph &G){
int M=MAXINT; //无穷大整数
int A[][NUM]={0,6,1,5,M,M, // 图结构
6,0,5,M,3,M,
1,5,0,5,6,4,
5,M,5,0,M,2,
M,3,6,M,0,6,
M,M,4,2,6,0,};
G.vexnum=NUM;
char ch[]="abcdef";六个顶点
for(int i=0;i<G.vexnum;i++)
G.vexs[i]=ch[i];
G.arcnum=0;
for(i=0;i<NUM;i++)
for(int j=0;j<NUM;j++){
G.arcs[i][j]=A[i][j];
if(A[i][j]!=M)
G.arcnum++;
}
return OK;
}//CreateGraph
2、最小生成树的核心算法,这里采用普里姆算法实现。我用VC++实现了模拟演示算法,
利用辅助数组closedge[6],算法过程在此程序后演示。
Status MiniSpanTree(Graph G,VexType v){
int k=LocateVex(G,v);
for(int j=0; j<G.vexnum;j++)
{
closedge[j].adjvex=v;
closedge[j].lowcost=G.arcs[k][j];
}
closedge[k].lowcost=0;
for(int i=0;i<5;i++){
int max=10000;
for(j=0;j<G.vexnum;j++) {//求出下一个结点
if(closedge[j].lowcost>0 && max>closedge[j].lowcost)
{ k=j; max=closedge[j].lowcost;}
}
PrintVex(G,closedge[k].adjvex,G.vexs[k]);//输出生成树的边
closedge[k].lowcost=0;
for(j=0;j<G.vexnum;j++){
if(G.arcs[k][j]<closedge[j].lowcost){
closedge[j].adjvex=G.vexs[k];
closedge[j].lowcost=G.arcs[k][j];
}//if
}//for
}//for
return OK;
}//MiniSpanTree
以下由于图形经过缩小,可能不是很清晰,在数组中: a、b、c、d、e、f 下标分别为:0 1 2 3 4 5
closedge数组中表示的含义是:i号(i为顶点的下标值)顶点到vexadj顶点的路径的边为lowcost。
假如当找到与i顶点的路径权值小于现有的lowcost,则替换之,并改变相信的vexadj顶点。
lowcost为0的表示此顶点被确定了树的相应的边。之后不再参与计算。
在整个过程中,vexadj是一个辅助变量,当相应的lowcost为0时,它就变得没有用,于是就不再改变它,
具体演示过程如下:
1、 开始计算,从a点开始生成最小生成树。
i=1:与a顶点连接的有b、c、d,其边的权值分别是6、1、5,
lowcost中找到最小权值1,其顶点为c,将其编入树中,
2、i=2,与c顶点相关的定点有a、b、d、e、f,其中a不被计算,其他相应权值为:5 5 6 4 ,于是所得closede数组变化如下:
lowcost中找到最小权值为4,相应顶点为f,编入树中,
3、i=3:与f相关联的顶点且没有被访问的顶点有:e、d,相应权值为:6、2 ,由于f—d小于a—d,于是将f替换a,如下:
lowcost中2位最小,将d编入树中,
4、i=4:与d相关的顶点都不能参与计算:
lowcost中找到5为最小权值,则将b编入树中,
5、i=5,与b相关的没有被访问过的只有e,与其边的权值为:3,小于c—e(6)的边,则替换之:
只剩下最后一个没有被访问,就是e,
6、i=6,最后计算结果如下:
最后结果如下:
对于VC写的这个演示软件,由于其中还有一点问题,现在不能发上,假如谁想要,我可以给你这个执行文件。