#include "stdio.h"
typedef char Vertextype; //頂點
typedef int EdgeType; //邊的權值
#define MAXVEX 100
#define INFINITY 65535
//鄰接矩陣
typedef struct
{
Vertextype vexs[MAXVEX]; //頂點表
EdgeType arc[MAXVEX][MAXVEX];//鄰接矩陣,可以看做邊表
int numvertexes, numEdges; //當前的頂點和邊數
}MGraph;
//普里姆算法最小生成樹
void MinSpanTree_Prim(MGraph G)
{
int min, i, j, k;
int adjvex[MAXVEX];//用來保存相關頂點下標
int lowcost[MAXVEX];//用來保存相關頂點間的權值
lowcost[0] = 0;//初始化第一個權值爲0,即v0加入生成樹。lowcost的值爲0,在這裏就是此下標的頂點已經加入生成樹
adjvex[0] = 0;//初始化第一個頂點下標爲0
for ( i = 1; i < G.numvertexes; i++)//循環除了下標爲0外的全部頂點
{
lowcost[i] = G.arc[0][i];//將v0頂點與之有點的權值存入數組
adjvex[i] = 0;//初始化都爲v0的下標
}
for ( i = 1; i <G.numvertexes; i++)
{
min = INFINITY;
j = 1;
k = 0;
while (j < G.numvertexes)//循環全部頂點
{
if (lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
k = j; //將當前最小值的下標存入k
}
j++;
}
printf("(%d,%d)",adjvex[k],k);//打印當前頂點邊中權值最小邊
lowcost[k] = 0;//將當前頂點的權值設置爲0,表示此頂點已經完成任務
for ( j = 1; j < G.numvertexes; j++)//循環所有頂點
{
if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j])
{
lowcost[j] = G.arc[k][j];
adjvex[j] = k;//將下標爲k的頂點存入adjvex
}
}
}
}