#include <iostream>
#include <vector>
#include <queue>
#define MaxSize 10
#define eletype int
using namespace std;
bool visited[MaxSize]; //全局数组,记录结点是否已补访问
typedef struct edgenode { //边表结点
int adjvex; //邻接点
int weight; //权值
edgenode *next; //下一条边
};
typedef struct vertexnode { //顶点结点
eletype data; //结点数据
edgenode *fist; //指向第一条边
}AdjList[MaxSize];
typedef struct AdjListGraph {
AdjList adjlist; //邻接表
int vex; //顶点数
int edge; //边数
};
void Init(AdjListGraph &G) { //初始化为未访问
for (int i = 0; i < MaxSize; i++) {
visited[i] = false;
}
}
int Location(AdjListGraph &G, eletype c) { //寻找顶点数据的邻接点
for (int i = 0; i < G.vex; i++) {
if (G.adjlist[i].data == c) {
return i;
}
}
return -1;
}
void Create(AdjListGraph &G) { //创建图
cout << "请输入该图的顶点数以及边数:" << endl;
cin >> G.vex >> G.edge;
cout << "请输入相关顶点:" << endl;
for (int i = 0; i < G.vex; i++) {
cin >> G.adjlist[i].data;
G.adjlist[i].fist = NULL;
}
eletype a, b;
int c;
int m, n;
cout << "请输入相关边的顶点以及权值:" << endl;
for (int i = 0; i < G.edge; i++) {
cin >> a >> b>>c;
m = Location(G, a); //寻找顶点号
n = Location(G, b);
if (m != -1 && n != -1) { //寻找到位置
edgenode *temp = new edgenode;
temp->adjvex = n;
temp->weight = c;
temp->next = G.adjlist[m].fist;
G.adjlist[m].fist = temp;
}
}
}
void Prim(AdjListGraph &G, int v) { //prim算法求最小生成树
vector<int> vec;//保存顶点序号
vec.push_back(v);
visited[v] = true;
cout << "Prim算法得到的边如下:" << endl;
while (vec.size() != G.vex) { //当没有访问所有的顶点时
vector<int>::iterator iter;
int w, Tag1, Tag2, min = 999;
edgenode *temp = NULL; //指向为空地址
for (iter = vec.begin(); iter != vec.end(); iter++) {
temp = G.adjlist[*iter].fist;
if (temp != NULL) {
w = temp->adjvex;
if (visited[w] == false) { //没有被访问
if (min > temp->weight) {
min = temp->weight; //更新min以及顶点序号
Tag1 = *iter;
Tag2 = w;
}
}
while (temp->next != NULL) {
temp = temp->next;
if (visited[temp->adjvex] == false) { //判断有没有被访问
if (min > temp->weight) {
min = temp->weight; //更新最小值
Tag1 = *iter;
Tag2 = temp->adjvex; //保存下一个顶点号
}
}
}
}
} //寻找到了最小边以及顶点号
visited[Tag2] = true; //标记为访问过
vec.push_back(Tag2); //添加到已访问队列
//下面输出每次得到的边
cout << G.adjlist[Tag1].data << " " << G.adjlist[Tag2].data << endl;
}
}
int main() {
AdjListGraph G;
Init(G);
Create(G); //创建图
Prim(G,0);
system("pause");
return 0;
}
/*
6 20
1 2 3 4 5 6
1 2 6
1 4 5
1 3 1
2 3 5
3 4 5
2 5 3
5 6 6
4 6 2
3 6 4
3 5 6
2 1 6
4 1 5
3 1 1
3 2 5
4 3 5
5 2 3
6 5 6
6 4 2
6 3 4
5 3 6
*/
图的Prim算法
最新推荐文章于 2022-11-01 19:58:19 发布