查看文章
 
最小生成树
2006-12-01 22:57

       这是前不久写的实验程序,最小生成树。现在将主要算法发上,如谁需要完整源代码,可以直接在这下面留言,留下邮箱地址,联系我: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写的这个演示软件,由于其中还有一点问题,现在不能发上,假如谁想要,我可以给你这个执行文件。

类别:数据结构||添加到搜藏 |分享到i贴吧|浏览(2177)|评论 (0)
 
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu