#include <iostream>
#define MAXSIZE 100
using namespace std;
//邻接矩阵
typedef struct Graph{
char Vertex[MAXSIZE];
int Edge[MAXSIZE][MAXSIZE];
int numV, numE; //定点数量与边数量
}adjMatrix;
void prim(adjMatrix* G, int start)
{
int prims[MAXSIZE]; //记录最小生成树的结果
bool isjoin[MAXSIZE]; // true 代表该结点已经加入树中
int lowCost[MAXSIZE]; //记录当前已加入最小生成树的各顶点所连边的权值
int min, k, index = 0;
lowCost[start] = 0; //自己到自己的距离为0
isjoin[start] = true;
prims[index++] = start;
for(int i = 0; i < G->numV; ++i)
lowCost[i] = G->Edge[start][i]; //把当前结点所连边的权值存入
for(int i = 0; i < G->numV; ++i) //循环,每次加入一个顶点
{
if(i == start)
continue; //不用考虑开始结点
min = INT_MAX;
for(int j = 0; j < G->numV; ++j)
{
if(!isjoin[j] && lowCost[j] < min)
{
min = lowCost[j];
k = j;
}
}
//找到最小权值,加入最小生成树。
isjoin[k] = true;
prims[index++] = k;
//更新lowCost数组
for(int j = 0; j < G->numV; ++j)
{
if(!isjoin[j] && G->Edge[k][j] < lowCost[j])
lowCost[j] = G->Edge[k][j];
}
}
for(int i = 0; i < index; ++i)
{
//记录最小生成树的结果
cout << G->Vertex[prims[i]]<<" ";
}
}
测试数据
int main()
{
//创建有权图邻接矩阵
adjMatrix* G = new adjMatrix();
G->Vertex[0] = 'a';
G->Vertex[1] = 'b';
G->Vertex[2] = 'c';
G->Vertex[3] = 'd';
G->Vertex[4] = 'e';
G->Vertex[5] = 'f';
G->numV = 6;
G->numE = 10;
G->Edge[0][0] = 0;
G->Edge[0][1] = 3;
G->Edge[0][2] = INT_MAX;
G->Edge[0][3] = INT_MAX;
G->Edge[0][4] = 6;
G->Edge[0][5] = 5;
G->Edge[1][0] = 3;
G->Edge[1][1] = 0;
G->Edge[1][2] = 1;
G->Edge[1][3] = INT_MAX;
G->Edge[1][4] = INT_MAX;
G->Edge[1][5] = 4;
G->Edge[2][0] = INT_MAX;
G->Edge[2][1] = 1;
G->Edge[2][2] = 0;
G->Edge[2][3] = 6;
G->Edge[2][4] = INT_MAX;
G->Edge[2][5] = 4;
G->Edge[3][0] = INT_MAX;
G->Edge[3][1] = INT_MAX;
G->Edge[3][2] = 6;
G->Edge[3][3] = 0;
G->Edge[3][4] = 8;
G->Edge[3][5] = 5;
G->Edge[4][0] = 6;
G->Edge[4][1] = INT_MAX;
G->Edge[4][2] = INT_MAX;
G->Edge[4][3] = 8;
G->Edge[4][4] = 0;
G->Edge[4][5] = 2;
G->Edge[5][0] = 5;
G->Edge[5][1] = 4;
G->Edge[5][2] = 4;
G->Edge[5][3] = 5;
G->Edge[5][4] = 2;
G->Edge[5][5] = 0;
prim(G,0);
return 0;
}