大话数据结构
Unit6 图
关于邻接矩阵的最小生成树PRIM算法
代码
#include <iostream>
typedef char VertexType;
typedef int EdgeType;
#define MAXVEX 100
#define INFINITY 65535
using namespace std;
int visited[100];
//构建顶点表
typedef struct {
VertexType vexs[MAXVEX]; //顶点数组
EdgeType arc[MAXVEX][MAXVEX]; //边的矩阵表示
int numVertexes, numEdges; //图中当前的顶点数和边数
}MGraph;
//创建邻接矩阵
void CreatMgraph(MGraph* G) {
int i, j, k, w;
cout << "输入顶点数和边数:" << endl;
cin >> G->numVertexes >> G->numEdges;
for (i = 0;i < G->numVertexes;i++) {
cout << "请输入顶点名:" << endl;
cin >> G->vexs[i];
}
//初始化邻接矩阵
for (i = 0;i < G->numVertexes;i++) {
for (j = 0;j < G->numVertexes;j++) {
G->arc[i][j] = INFINITY;
}
}
//构建邻接矩阵
for (k = 0;k < G->numEdges;k++) {
cout << "输入边(vi,vj)上的下标i,下标j和权w:" << endl;
cin >> i >> j >> w;
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];
}
}
//Prim算法生成最小生成树
void MiniSpanTree_Prim(MGraph G) {
int min, i, j, k;
int adjvex[MAXVEX];
int lowcost[MAXVEX];
lowcost[0] = 0;
adjvex[0] = 0;
for (i = 0;i < G.numVertexes;i++) {
lowcost[i] = G.arc[0][i];
adjvex[i] = 0;
}
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;
}
j++;
}
cout << G.vexs[k]<<min;
lowcost[k] = 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;
}
}
}
}
int main() {
MGraph* grap = (MGraph*)malloc(sizeof(MGraph));
CreatMgraph(grap);
MiniSpanTree_Prim(*grap);
free(grap);
return 0;
}
运行结果