一、创建邻接矩阵
二、prim算法
思路:定义一个数组表示已被访问过的节点,先从一个根节点出发,首先把这个根节点放入数组中,表示该节点已被访问,然后再找到权值最小的一个邻接点,把它放入数组中,再次去找和已被访问的节点权值最小的未被访问过的节点,如此往复直到节点全部被访问过。
三、全部代码
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
#include<limits.h>
using namespace std;
#define MaxInt INT_MAX
#define MaxN 20
typedef char VertexType;
typedef int ArcType;
typedef struct Mgraph {
VertexType vex[MaxN];
ArcType arc[MaxN][MaxN];
int m[MaxN];
int vexmun, arcmun;
}Mgraph;
void prim(Mgraph G,char a);
void Findmin(Mgraph G, int& p, int& q);
void CreateMgraph(Mgraph& G);
int LocateMgraph(Mgraph G, char a);
int main() {
Mgraph G;
cout << "输入示例:\n";
CreateMgraph(G);
char a;
cout << "所访问的根节点:";
cin >> a;
cout << "输出示例:\n";
prim(G,a);
return 0;
}
void CreateMgraph(Mgraph& G) {
cout << "顶点的数目:";
cin >> G.vexmun;
cout << "边的数目:";
cin >> G.arcmun;
int i;
cout << "顶点:";
for (i = 0; i < G.vexmun; i++)
{
cin >> G.vex[i];
}
cout << "边的关系:\n";
for (i = 0; i < G.vexmun; i++)
for (int j = 0; j < G.vexmun; j++)
G.arc[i][j] = MaxInt;
for (i = 0; i < G.arcmun; i++)
{
char a, b;
int m;
cin >> a >> b >> m;
int p = LocateMgraph(G, a);
int q = LocateMgraph(G, b);
G.arc[p][q] = G.arc[q][p] = m;
}
}
int LocateMgraph(Mgraph G, char a) {
int i;
for (i = 0; i < G.vexmun; i++) if (a == G.vex[i]) break;
return i;
}
void prim(Mgraph G,char a) {
int f=LocateMgraph(G,a), p, q;
int i;
for (i = 0; i < G.vexmun; i++)
G.m[i] = -1; //先将所有未访问的节点标记为-1
i = 1;
G.m[0] = f; //根节点的序号放入数组中
while (i < G.vexmun) { //输出已被访问的节点的最小权值的边
Findmin(G,p, q);
cout << G.vex[p]<< " " << G.vex[q] << endl;
G.arc[p][q] = G.arc[q][p] = MaxInt; //将已被访问的节点的最小权值置为无穷大
G.m[i++] = q;}
}
void Findmin(Mgraph G, int& p, int& q)//找到和已被访问的节点之间最小的边的权值的节点
{
int a = 0, j=MaxInt;
while (G.m[a] != -1) {
for (int i = 0; i < G.vexmun; i++)
if (G.arc[G.m[a]][i] < j ) { j = G.arc[G.m[a]][i]; p =G.m[a]; q = i; }
a++;
}
if (j == MaxInt) exit(-1);
}
四、展示