请设计int Kruskal(Graph g)函数。 该函数用Kruskal算法求g的最小生成树的权,并返回最小生成树的权。 如果最小生成树不存在,则返回-1。 请注意,本题有预置代码,只需提交所要求的函数定义代码即可。邻接矩阵
时间: 2024-03-18 20:39:17 浏览: 46
Kruskal算法求最小生成树.doc
好的,以下是int Kruskal(Graph g)函数的设计:
```C++
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN = 1005;
int n, m;
int fa[MAXN];
struct Edge {
int u, v, w;
bool operator < (const Edge& e) const {
return w < e.w;
}
} edges[MAXN * MAXN];
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int Kruskal(Graph g) {
// 初始化并查集
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
// 将边按权值从小到大排序
sort(edges, edges + m);
int cnt = 0, ans = 0;
for (int i = 0; i < m; i++) {
int u = edges[i].u, v = edges[i].v, w = edges[i].w;
int fu = find(u), fv = find(v);
if (fu != fv) {
fa[fu] = fv;
ans += w;
cnt++;
}
if (cnt == n - 1) {
return ans;
}
}
return -1;
}
```
其中,Graph表示邻接矩阵,n表示图中节点数,m表示边数。edges数组用于存储边的信息,包括起点、终点和权值。find函数是并查集中的查找函数,用于查找节点所在的集合。Kruskal函数首先初始化并查集,然后将边按照权值从小到大排序。接下来,依次取出每条边,如果这条边的起点和终点不在同一个集合中,则将它们合并到一个集合中,并将边的权值加入到最小生成树的权值中。最后,如果最小生成树中边的数量为n-1,则返回最小生成树的权值,否则返回-1。
阅读全文