1 #include<stdio.h> 2 #include<stdlib.h> 3 #define OK 1 4 #define TRUE 1 5 #define FALSE 0 6 #define ERROR -1 7 #define OVERFLOW -2 8 #define INFINITY 65535 9 #define MAX_VERTEX_NUM 20 10 typedef int Status; 11 typedef char TreeType; 12 //定义邻接矩阵数据结构 13 typedef struct 14 { 15 TreeType vexs[MAX_VERTEX_NUM]; 16 int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; 17 int vexnum,arcnum; 18 }MGraph; 19 Status CreateMGraph(MGraph &G)//构造一个图型存储结构 20 { 21 int i,j,k; 22 puts("请输入构成图的顶点个数和边数:"); 23 scanf("%d%d%*c",&G.vexnum,&G.arcnum); 24 puts("请输入顶点数值:"); 25 for(i=0;i<G.vexnum;i++) 26 scanf("%c",&G.vexs[i]); 27 for(i=0;i<G.vexnum;i++) 28 for(j=0;j<G.vexnum;j++) 29 if(i==j) G.arcs[i][j]=0; 30 else G.arcs[i][j]=INFINITY; 31 puts("请依次输入边(Vi,Vj)的顶点序号及权值:"); 32 for(k=0;k<G.arcnum;k++) 33 { 34 scanf("%d%d",&i,&j); 35 scanf("%d",&G.arcs[i][j]); 36 G.arcs[j][i]=G.arcs[i][j]; 37 } 38 return OK; 39 } 40 Status MiniSpanTree_Prim(MGraph G) 41 { 42 int min,i,j,k,minLength; 43 int adjvex[MAX_VERTEX_NUM],lowcost[MAX_VERTEX_NUM]; 44 lowcost[0]=adjvex[0]=minLength=0; 45 for(i=1;i<G.vexnum;i++) 46 { 47 lowcost[i]=G.arcs[0][i]; 48 adjvex[i]=0; 49 } 50 puts("最小生成树为:"); 51 for(i=1;i<G.vexnum;i++) 52 { 53 min=INFINITY; 54 for(j=1,k=0;j<G.vexnum;j++) 55 if(lowcost[j]&&lowcost[j]<min) 56 { 57 min=lowcost[j]; 58 k=j; 59 } 60 minLength+=G.arcs[adjvex[k]][k]; 61 printf("(%d,%d) ",adjvex[k],k); 62 for(lowcost[k]=0,j=1;j<G.vexnum;j++) 63 if(lowcost[j]&&G.arcs[k][j]<lowcost[j]) 64 { 65 lowcost[j]=G.arcs[k][j]; 66 adjvex[j]=k; 67 } 68 } 69 printf("\n最小生成树的长度为:\n%d\n",minLength); 70 return OK; 71 } 72 Status main() 73 { 74 MGraph G; 75 CreateMGraph(G); 76 MiniSpanTree_Prim(G); 77 system("pause"); 78 return OK; 79 }
相关文章: