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 }