Prim求解最小生成树
1 #include "ljjz.h" 2 3 typedef struct edgedata /*用于保存最小生成树的边类型定义*/ 4 { int beg,en; /*beg,en是边顶点序号*/ 5 int length; /*边长*/ 6 }edge; 7 8 /*函数功能:prim算法构造最小生成树 9 函数参数:图的邻接矩阵g;边向量edge 10 */ 11 void prim(Mgraph g, edge tree[M-1]) 12 { edge x; 13 int d,min,j,k,s,v; 14 15 /* 建立初始入选点,并初始化生成树边集tree*/ 16 for(v=1;v<=g.n-1;v++) 17 { 18 tree[v-1].beg=0; 19 tree[v-1].en=v; 20 tree[v-1].length=g.edges[0][v]; 21 } 22 23 /*依次求当前(第k条)最小两栖边,并加入TE*/ 24 for(k=0;k<=g.n-3;k++) 25 { 26 min=tree[k].length; 27 s=k; 28 for(j=k+1;j<=g.n-2;j++) 29 if(tree[j].length<min) 30 { 31 min=tree[j].length; 32 s=j; 33 } 34 v=tree[s].en; 35 x=tree[s]; 36 tree[s]=tree[k]; 37 tree[k]=x; 38 39 /*由于新顶点v的加入,修改两栖边的基本信息*/ 40 for(j=k+1;j<=g.n-2;j++) 41 { 42 d=g.edges[v][tree[j].en]; 43 if(d<tree[j].length) 44 { 45 tree[j].length=d; 46 tree[j].beg=v; 47 } 48 } 49 } 50 /*输出最小生成树*/ 51 printf("\n最小生成树是:\n");/*输出最小生成树*/ 52 for (j=0;j<=g.n-2;j++) 53 printf("\n%c---%c %d\n",g.vexs[tree[j].beg],g.vexs[tree[j].en],tree[j].length); 54 printf("\n最小生成树的根是: %c\n", g.vexs[0]); 55 } 56 57 int main() 58 { 59 Mgraph g; 60 edge tree[M-1]; /*用于存放最小生成树的M-1条边*/ 61 creat(&g,"g.txt",0); /*创建无向图的邻接矩阵*/ 62 prim(g,tree); /*求解图的最小生成树*/ 63 return 0; 64 65 }
1 /********************************************/ 2 /* 邻接矩阵类型定义的头文件 */ 3 /* 文件名:ljjz.h */ 4 /********************************************/ 5 6 #include <stdio.h> 7 #define FINITY 5000 /*此处用5000代表无穷大*/ 8 #define M 20 /*最大顶点数*/ 9 typedef char vertextype; /*顶点值类型*/ 10 typedef int edgetype; /*权值类型*/ 11 typedef struct{ 12 vertextype vexs[M]; /*顶点信息域*/ 13 edgetype edges[M][M]; /*邻接矩阵*/ 14 int n,e; /*图中顶点总数与边数*/ 15 } Mgraph; /*邻接矩阵表示的图类型*/ 16 /* 函数功能:建立图的邻接矩阵存储结构 17 函数参数:邻接矩阵的指针变量g;存放图信息的文件名s;图的类型c,c=0表示建立无向图,否则表示建立有向图 18 函数返回值:无 19 */ 20 void creat(Mgraph *g,char *s ,int c) 21 {int i,j,k,w; /*建立网络的邻接矩阵存储结构*/ 22 FILE *rf ; 23 rf = fopen(s, "r") ; /*从文件中读取图的边信息*/ 24 if (rf) 25 { 26 fscanf(rf,"%d%d",&g->n,&g->e); /*读入图的顶点数与边数*/ 27 for(i=0;i<g->n;i++) /*读入图中的顶点值*/ 28 fscanf(rf,"%1s",&g->vexs[i]); 29 30 for(i=0;i<g->n;i++) /*初始化邻接矩阵*/ 31 for(j=0;j<g->n;j++) 32 if (i==j) g->edges[i][j]=0; 33 else g->edges[i][j]=FINITY; 34 35 for (k=0;k<g->e;k++) /*读入网络中的边*/ 36 {fscanf(rf,"%d%d%d", &i,&j,&w); 37 g->edges[i][j]=w; 38 if (c==0) g->edges[j][i]=w; /*如果C==0则建立无向图邻接矩阵,否则建立有向图邻矩阵*/ 39 } 40 fclose(rf); 41 } 42 else g->n=0; 43 } 44 45 46 void print(Mgraph g) 47 {/*辅助函数,输出邻接矩阵表示的图g*/ 48 int i,j; 49 50 for (i=0;i<g.n;i++) 51 { printf("%c ",g.vexs[i]); 52 } 53 printf("\n"); 54 for (i=0;i<g.n;i++) 55 { for (j=0;j<g.n;j++) 56 {printf("%6d",g.edges[i][j]); 57 } 58 printf("\n"); 59 } 60 }