1 /* 2 普里姆算法的主要思想: 3 利用二维数组把权值放入,然后找在当前顶点的最小权值,然后走过的路用一个数组来记录 4 */ 5 # include <stdio.h> 6 7 typedef char VertexType;//定义顶点类型 8 typedef int EdgeType;//定义边上的权值类型 9 # define MAX_VERTEX 100//最大顶点个数 10 # define INFINITY 65535//用65535代表无穷大 11 12 typedef struct 13 {//邻接矩阵存储结构 14 VertexType vexs[MAX_VERTEX];//顶点表 15 EdgeType arc[MAX_VERTEX][MAX_VERTEX];//邻接矩阵 16 int numVertexs, numEdges;//图中当前的顶点数和边数 17 18 }MGraph; 19 20 void CreateMGraph(MGraph *G) 21 { 22 int i, j; 23 G->numEdges=15; 24 G->numVertexs=9; 25 26 for (i = 0; i < G->numVertexs; i++) 27 { 28 for ( j = 0; j < G->numVertexs; j++) 29 { 30 if (i==j) 31 G->arc[i][j]=0; 32 else 33 G->arc[i][j] = G->arc[j][i] = INFINITY; 34 } 35 } 36 37 G->arc[0][1]=10; 38 G->arc[0][5]=11; 39 G->arc[1][2]=18; 40 G->arc[1][8]=12; 41 G->arc[1][6]=16; 42 G->arc[2][8]=8; 43 G->arc[2][3]=22; 44 G->arc[3][8]=21; 45 G->arc[3][6]=24; 46 G->arc[3][7]=16; 47 G->arc[3][4]=20; 48 G->arc[4][7]=7; 49 G->arc[4][5]=26; 50 G->arc[5][6]=17; 51 G->arc[6][7]=19; 52 53 for(i = 0; i < G->numVertexs; i++) 54 { 55 for(j = i; j < G->numVertexs; j++) 56 { 57 G->arc[j][i] =G->arc[i][j]; 58 } 59 } 60 61 } 62 63 void MinSpanTree_Peim (MGraph &G) 64 {//普里姆算法,最小生成树 65 int min, i, j, k; 66 int add=0; 67 int adjvex[MAX_VERTEX]; 68 int lowcost[MAX_VERTEX]; 69 lowcost[0] = 0; 70 adjvex[0] = 0; 71 72 for (i=1; i<G.numVertexs; i++) 73 {//若是从v0顶点开始查找,从顶点v0的矩阵全部赋值到lowcost数组中,adjvex数组全部为0; 74 lowcost[i] = G.arc[0][i];//二维数组存放的权值 75 adjvex[i] = 0;//所有都为0 76 } 77 78 for (i=1; i<G.numVertexs; i++) 79 {//最小生成树 80 min = INFINITY;//无穷大 81 j=1; 82 k=0; 83 84 while (j < G.numVertexs) 85 {//查找lowcost数组中最小的值,把最小的值赋给min,且最小值的下表赋给k 86 if (lowcost[j]!=0 && lowcost[j]<min) 87 { 88 min = lowcost[j];//存放最小的权值 89 k = j;//把存放最小权值的顶点下标 90 } 91 j++; 92 } 93 printf ("(%d——%d)\n", adjvex[k], k); 94 add = add + G.arc[adjvex[k]][k]; 95 /*因为52~56行已经把adjvex数组全部赋值为0,所以一开始打印出来的就是0,后来打印出来的就是以上一个在lowcost 96 数组中最小值的下表(下表对应的顶点),顶点的矩阵中比当前lowcost数组中的值还要小的值的下标,和lowcost数组中最小值的下标*/ 97 lowcost[k] = 0; 98 //若刚才存放最小权值的顶点是1(k=1),则下面就for循环就从发1的二位数组继续寻找最小生成树 99 for (j=1; j<G.numVertexs; j++) 100 {//以在lowcost数组中最小值的下表作为二位数组的第一个下标与当前lowcos数组中的值进行比较。 101 //查找最小值 102 if (lowcost[j]!=0 && G.arc[k][j]<lowcost[j])//t 103 { 104 lowcost[j] = G.arc[k][j];//0 105 adjvex[j] = k; 106 } 107 } 108 } 109 printf ("%d\n", add); 110 111 return; 112 } 113 114 int main (void) 115 { 116 MGraph G; 117 CreateMGraph (&G); 118 MinSpanTree_Peim (G); 119 120 return 0; 121 } 122 123 /* 124 在vc++6.0运行结果: 125 请输入顶点数和边数:9 15 126 请输入第1个顶点信息:v0 127 请输入第2个顶点信息:v1 128 请输入第3个顶点信息:v2 129 请输入第4个顶点信息:v3 130 请输入第5个顶点信息:v4 131 请输入第6个顶点信息:v5 132 请输入第7个顶点信息:v6 133 请输入第8个顶点信息:v7 134 请输入第9个顶点信息:v8 135 请输入边(vi,vj)上的下表i,下表j和权w:0 1 10 136 请输入边(vi,vj)上的下表i,下表j和权w:0 5 11 137 请输入边(vi,vj)上的下表i,下表j和权w:1 6 16 138 请输入边(vi,vj)上的下表i,下表j和权w:1 2 18 139 请输入边(vi,vj)上的下表i,下表j和权w:1 8 12 140 请输入边(vi,vj)上的下表i,下表j和权w:2 8 8 141 请输入边(vi,vj)上的下表i,下表j和权w:2 3 22 142 请输入边(vi,vj)上的下表i,下表j和权w:8 3 21 143 请输入边(vi,vj)上的下表i,下表j和权w:6 5 17 144 请输入边(vi,vj)上的下表i,下表j和权w:6 3 24 145 请输入边(vi,vj)上的下表i,下表j和权w:6 7 19 146 请输入边(vi,vj)上的下表i,下表j和权w:3 4 20 147 请输入边(vi,vj)上的下表i,下表j和权w:3 7 16 148 请输入边(vi,vj)上的下表i,下表j和权w:4 7 7 149 请输入边(vi,vj)上的下表i,下表j和权w:4 5 26 150 (0——1) 151 (0——5) 152 (1——8) 153 (8——2) 154 (1——6) 155 (6——7) 156 (7——4) 157 (7——3) 158 Press any key to continue 159 160 */
时间: 2024-10-25 18:56:35