c++写输入一个有向带权图,用prim算法实现求图的最小生成树并输出图的最小生成树输出每个节点是谁节点的左孩子是谁节点的右孩子是谁
时间: 2024-02-27 10:53:53 浏览: 54
好的,以下是C++代码实现:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 100;
const int INF = 0x3f3f3f3f;
int n, m;
int graph[MAXN][MAXN]; // 邻接矩阵存储图
int d[MAXN]; // 距离数组
int visited[MAXN]; // 记录节点是否被访问过
int parent[MAXN]; // 记录每个节点的父节点
int lchild[MAXN]; // 记录每个节点的左孩子
int rchild[MAXN]; // 记录每个节点的右孩子
void prim(int start)
{
memset(d, INF, sizeof(d)); // 初始化距离数组
memset(visited, 0, sizeof(visited)); // 初始化节点访问数组
memset(parent, -1, sizeof(parent)); // 初始化父节点数组
d[start] = 0; // 设置起点的距离为0
parent[start] = -1; // 起点没有父节点
for (int i = 0; i < n; i++)
{
int u = -1;
int minD = INF;
for (int j = 0; j < n; j++) // 找到未访问的距离最小的节点
{
if (!visited[j] && d[j] < minD)
{
u = j;
minD = d[j];
}
}
if (u == -1) return; // 如果不存在这样的节点,说明已经遍历完了
visited[u] = 1; // 标记节点u已经被访问
// 更新与节点u相邻的节点的距离和父节点
for (int v = 0; v < n; v++)
{
if (!visited[v] && graph[u][v] < d[v])
{
d[v] = graph[u][v];
parent[v] = u;
}
}
}
}
void printTree()
{
for (int i = 0; i < n; i++)
{
if (parent[i] == -1) // 根节点
{
cout << "节点" << i << "是根节点" << endl;
}
else // 非根节点
{
if (lchild[parent[i]] == -1) // 如果父节点的左孩子为空,则当前节点为左孩子
{
lchild[parent[i]] = i;
cout << "节点" << i << "是节点" << parent[i] << "的左孩子" << endl;
}
else // 否则当前节点为右孩子
{
rchild[parent[i]] = i;
cout << "节点" << i << "是节点" << parent[i] << "的右孩子" << endl;
}
}
}
}
int main()
{
cin >> n >> m;
memset(graph, INF, sizeof(graph)); // 初始化邻接矩阵
memset(lchild, -1, sizeof(lchild)); // 初始化左孩子数组
memset(rchild, -1, sizeof(rchild)); // 初始化右孩子数组
for (int i = 0; i < m; i++)
{
int u, v, w;
cin >> u >> v >> w;
graph[u][v] = w;
graph[v][u] = w; // 无向图的情况下需要加上这一行
}
prim(0); // 从0号节点开始计算最小生成树
printTree(); // 输出最小生成树的信息
return 0;
}
```
代码中使用了邻接矩阵存储图,prim算法计算最小生成树,并根据所求的最小生成树输出每个节点的左孩子和右孩子。
阅读全文