鄰接矩陣 最小生成樹 普里姆算法

//風雨難洗心痕,滄桑不滅情傷。莫要輕言亙古,離散纔看荒涼。


#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
}
}
}
}
發佈了29 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章