给我一个 采用邻接矩阵存储一个无向图并用这个邻接矩阵实现无向图的最小生成树的PRIM算法c++代码
时间: 2024-01-10 07:07:55 浏览: 83
Prim算法计算最小生成树(无向图&邻接矩阵)_算法_数据结构_
5星 · 资源好评率100%
以下是一个使用邻接矩阵存储无向图并实现Prim算法的C++代码:
```c++
#include <iostream>
#include <climits>
using namespace std;
#define MAX_SIZE 100
class Graph {
private:
int num_vertex; // 图顶点的个数
int adj_matrix[MAX_SIZE][MAX_SIZE]; // 邻接矩阵
int parent[MAX_SIZE]; // 最小生成树中每个节点的父节点
int key[MAX_SIZE]; // 用于Prim算法的关键字数组
bool visited[MAX_SIZE]; // 节点是否已经被访问
public:
Graph(int num_vertex) {
this->num_vertex = num_vertex;
for (int i = 0; i < num_vertex; i++) {
for (int j = 0; j < num_vertex; j++) {
adj_matrix[i][j] = 0;
}
visited[i] = false;
key[i] = INT_MAX;
}
}
void add_edge(int i, int j, int weight) {
adj_matrix[i][j] = weight;
adj_matrix[j][i] = weight;
}
void prim() {
key[0] = 0;
parent[0] = -1;
for (int i = 0; i < num_vertex - 1; i++) {
// 找到未被访问的关键字最小的节点
int min_key = INT_MAX;
int min_index = -1;
for (int j = 0; j < num_vertex; j++) {
if (!visited[j] && key[j] < min_key) {
min_key = key[j];
min_index = j;
}
}
visited[min_index] = true;
// 更新相邻节点的关键字和父节点
for (int j = 0; j < num_vertex; j++) {
if (adj_matrix[min_index][j] && !visited[j] && adj_matrix[min_index][j] < key[j]) {
key[j] = adj_matrix[min_index][j];
parent[j] = min_index;
}
}
}
}
void print_tree() {
cout << "Edge\tWeight" << endl;
for (int i = 1; i < num_vertex; i++) {
cout << parent[i] << " - " << i << "\t" << adj_matrix[i][parent[i]] << endl;
}
}
};
int main() {
Graph g(7);
g.add_edge(0, 1, 7);
g.add_edge(0, 3, 5);
g.add_edge(1, 2, 8);
g.add_edge(1, 3, 9);
g.add_edge(1, 4, 7);
g.add_edge(2, 4, 5);
g.add_edge(3, 4, 15);
g.add_edge(3, 5, 6);
g.add_edge(4, 5, 8);
g.add_edge(4, 6, 9);
g.add_edge(5, 6, 11);
g.prim();
g.print_tree();
return 0;
}
```
以上代码中,我们在Graph类中增加了三个成员变量:parent、key和visited,分别用于存储最小生成树中每个节点的父节点、Prim算法的关键字数组和节点是否已经被访问。在prim函数中,我们首先将节点0标记为已访问,并将其关键字设为0,然后依次找到未被访问的关键字最小的节点,并将其标记为已访问。接着,我们更新未被访问的相邻节点的关键字和父节点。
最后,我们在print_tree函数中输出最小生成树的边和权重。在main函数中,我们创建了一个Graph对象,并向其中添加了一些边,然后调用prim函数求解最小生成树,并调用print_tree函数输出结果。
阅读全文