用DEVC++写一份代码 Prim算法实现最小生成树 一般情况下,假设n个顶点分成两个集合:U(包含已落在生成树上的结点)和 V-U(尚未落在生成树上的顶点),则在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。 输入图的相关信息,使用Prim算法,生成最小生成树(从图中序号最小的顶点开始)。 注意:选择邻接顶点时,若多个邻接顶点,按顶点编号从小到大的顺序,优先选择编号小的邻接顶点。 输入说明: 先输入图中顶点个数和边的数目,空格间隔; 然后输入每个顶点的数据; 最后依次输入每条边的起始和终止顶点的位序及边上的权值,格式为:顶点1位序 顶点2位序 权值。 输出说明: 按生成次序依次输出最小生成树中的各边的起始顶点位序和终止顶点位序,用英文逗号间隔,且用一对圆括号括起来。 注意:所有顶点的数据,不论是数字还是字符,顶点的位序按ASCII码值从小到大设置。
时间: 2024-02-09 22:08:12 浏览: 67
很高兴为您提供一份使用 DEVC++ 编写的代码,注意需要设置编码为 GBK,以下是完整代码:
```c++
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;
int n, m;
int G[MAXN][MAXN], d[MAXN], vis[MAXN], pre[MAXN];
void prim(int s) {
memset(d, INF, sizeof(d));
memset(vis, 0, sizeof(vis));
memset(pre, -1, sizeof(pre));
d[s] = 0;
for (int i = 1; i <= n; ++i) {
int u = -1, MIN = INF;
for (int j = 1; j <= n; ++j) {
if (!vis[j] && d[j] < MIN) {
u = j;
MIN = d[j];
}
}
if (u == -1) return;
vis[u] = 1;
for (int v = 1; v <= n; ++v) {
if (!vis[v] && G[u][v] < d[v]) {
d[v] = G[u][v];
pre[v] = u;
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
G[i][j] = INF;
}
}
for (int i = 1; i <= n; ++i) {
int x;
cin >> x;
}
for (int i = 1; i <= m; ++i) {
int u, v, w;
cin >> u >> v >> w;
G[u][v] = G[v][u] = w;
}
prim(1);
for (int i = 2; i <= n; ++i) {
cout << "(" << pre[i] << "," << i << ")" << endl;
}
return 0;
}
```
希望能够帮到您!
阅读全文