1. #include "stdio.h"
    2. #include "stdlib.h"
    3. #include "io.h"
    4. #include "math.h"
    5. #include "time.h"
    6. #define OK 1
    7. #define ERROR 0
    8. #define TRUE 1
    9. #define FALSE 0
    10. #define MAXEDGE 20
    11. #define MAXVEX 20
    12. #define INFINITY 65535
    13. typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
    14. typedef struct
    15. {
    16. int arc[MAXVEX][MAXVEX];
    17. int numVertexes, numEdges;
    18. }MGraph;
    19. void CreateMGraph(MGraph *G)/* 构件图 */
    20. {
    21. int i, j;
    22. /* printf("请输入边数和顶点数:"); */
    23. G->numEdges=15;
    24. G->numVertexes=9;
    25. for (i = 0; i < G->numVertexes; i++)/* 初始化图 */
    26. {
    27. for ( j = 0; j < G->numVertexes; j++)
    28. {
    29. if (i==j)
    30. G->arc[i][j]=0;
    31. else
    32. G->arc[i][j] = G->arc[j][i] = INFINITY;
    33. }
    34. }
    35. G->arc[0][1]=10;
    36. G->arc[0][5]=11;
    37. G->arc[1][2]=18;
    38. G->arc[1][8]=12;
    39. G->arc[1][6]=16;
    40. G->arc[2][8]=8;
    41. G->arc[2][3]=22;
    42. G->arc[3][8]=21;
    43. G->arc[3][6]=24;
    44. G->arc[3][7]=16;
    45. G->arc[3][4]=20;
    46. G->arc[4][7]=7;
    47. G->arc[4][5]=26;
    48. G->arc[5][6]=17;
    49. G->arc[6][7]=19;
    50. for(i = 0; i < G->numVertexes; i++)
    51. {
    52. for(j = i; j < G->numVertexes; j++)
    53. {
    54. G->arc[j][i] =G->arc[i][j];
    55. }
    56. }
    57. }
    58. /* Prim算法生成最小生成树 */
    59. void MiniSpanTree_Prim(MGraph G)
    60. {
    61. int min, i, j, k;
    62. int adjvex[MAXVEX]; /* 保存相关顶点下标 */
    63. int lowcost[MAXVEX]; /* 保存相关顶点间边的权值 */
    64. lowcost[0] = 0;/* 初始化第一个权值为0,即v0加入生成树 */
    65. /* lowcost的值为0,在这里就是此下标的顶点已经加入生成树 */
    66. adjvex[0] = 0; /* 初始化第一个顶点下标为0 */
    67. for(i = 1; i < G.numVertexes; i++) /* 循环除下标为0外的全部顶点 */
    68. {
    69. lowcost[i] = G.arc[0][i]; /* 将v0顶点与之有边的权值存入数组 */
    70. adjvex[i] = 0; /* 初始化都为v0的下标 */
    71. }
    72. for(i = 1; i < G.numVertexes; i++)
    73. {
    74. min = INFINITY; /* 初始化最小权值为∞, */
    75. /* 通常设置为不可能的大数字如32767、65535等 */
    76. j = 1;k = 0;
    77. while(j < G.numVertexes) /* 循环全部顶点 */
    78. {
    79. if(lowcost[j]!=0 && lowcost[j] < min)/* 如果权值不为0且权值小于min */
    80. {
    81. min = lowcost[j]; /* 则让当前权值成为最小值 */
    82. k = j; /* 将当前最小值的下标存入k */
    83. }
    84. j++;
    85. }
    86. printf("(%d, %d)\n", adjvex[k], k);/* 打印当前顶点边中权值最小的边 */
    87. lowcost[k] = 0;/* 将当前顶点的权值设置为0,表示此顶点已经完成任务 */
    88. for(j = 1; j < G.numVertexes; j++) /* 循环所有顶点 */
    89. {
    90. if(lowcost[j]!=0 && G.arc[k][j] < lowcost[j])
    91. {/* 如果下标为k顶点各边权值小于此前这些顶点未被加入生成树权值 */
    92. lowcost[j] = G.arc[k][j];/* 将较小的权值存入lowcost相应位置 */
    93. adjvex[j] = k; /* 将下标为k的顶点存入adjvex */
    94. }
    95. }
    96. }
    97. }
    98. int main(void)
    99. {
    100. MGraph G;
    101. CreateMGraph(&G);
    102. MiniSpanTree_Prim(G);
    103. return 0;
    104. }