/* ç¨é»æ¥ç©éµè¡¨ç¤ºçå¾çprimç®æ³çæºç¨åº*/
#include<stdio.h>
#define MAXVEX 6
typedef char VexType;
typedef float AdjType;
typedef struct {
int n;
/* å¾ç顶ç¹ä¸ªæ° */
/*VexType vexs[MAXVEX];
顶ç¹ä¿¡æ¯ */
AdjType arcs[MAXVEX][MAXVEX];
/* è¾¹ä¿¡æ¯ */
} GraphMatrix;
typedef struct{
int start_vex, stop_vex;
/* è¾¹çèµ·ç¹åç»ç¹ */
AdjType weight;
/* è¾¹çæ */
} Edge;
Edge mst[5];
#define MAX 1e+8
void prim(GraphMatrix * pgraph, Edge mst[]) {
int i, j, min, vx, vy;
float weight, minweight; Edge edge;
for (i = 0; i < pgraph->n-1; i++) {
mst[i].start_vex = 0;
mst[i].stop_vex = i+1;
mst[i].weight = pgraph->arcs[0][i+1];
}
for (i = 0; i < pgraph->n-1; i++) {
/* å
±n-1æ¡è¾¹ */
minweight = MAX; min = i;
for (j = i; j < pgraph->n-1; j++)/* ä»ææè¾¹(vx,vy)(vxâU,vyâV-U)ä¸éåºæççè¾¹ */
if(mst[j].weight < minweight) {
minweight = mst[j].weight;
min = j;
}
/* mst[min]æ¯æççè¾¹(vx,vy)(vxâU, vyâV-U)ï¼å°mst[min]å å
¥æå°çææ */
edge = mst[min];
mst[min] = mst[i];
mst[i] = edge;
vx = mst[i].stop_vex;
/* vx为åå å
¥æå°çææ ç顶ç¹çä¸æ */
for(j = i+1; j < pgraph->n-1; j++) { /* è°æ´mst[i+1]å°mst[n-1] */
vy=mst[j].stop_vex; weight = pgraph->arcs[vx][vy];
if (weight < mst[j].weight) {
mst[j].weight = weight;
mst[j].start_vex = vx;
}
}
}
}
GraphMatrix graph = {
6,
{{0,10,MAX,MAX,19,21},
{10,0,5,6,MAX,11},
{MAX,5,0,6,MAX,MAX},
{MAX,6,6,0,18,14},
{19,MAX,MAX,18,0,33},
{21,11,MAX,14,33,0}
}
};
int main(){
int i;
prim(&graph,mst);
for (i = 0; i < graph.n-1; i++)
printf("(%d %d %.0f)\
", mst[i].start_vex,
mst[i].stop_vex, mst[i].weight);
return 0;
}
温馨提示:答案为网友推荐,仅供参考