您的位置:首页 > 其它

图论-最小生成树-Kruskal

2016-05-11 17:18 274 查看
利用并查集来实现判断,方便快捷。

#include <iostream>
#include <algorithm>

using namespace std;

// 使用并查集来判断是否构成回路

const int MAX_N = 100;
const int MAX_E = 100;

int par[MAX_N]; //父亲
int ranks[MAX_N]; // 树的高度

//初始化n个元素
void init(int n) {
for (int i = 0; i < n; i++) {
par[i] = i;
ranks[i] = 0;
}
}

//查询树的根
int find(int x) {
if (par[x] == x) {
return x;
}
else return (par[x] = find(par[x])); //优化
}

//合并x和y所属的集合
void unite(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return;

if (ranks[x] < ranks[y]) {
par[x] = y;
}
else {
par[y] = x;
if (ranks[x] == ranks[y]) ranks[x]++;
}
}

//判断x和y是否属于同一个集合
bool same(int x, int y) {
return find(x) == find(y);
}

//

struct edge{int u, v, cost;};

bool comp(const edge& e1, const edge& e2) {
return e1.cost < e2.cost;
}
edge es[MAX_E];
int V,E;

int kruskal() {
sort(es, es+E, comp);
init(V);
int res = 0;
for (int i = 0; i < E; i++) {
edge e = es[i];
if (!same(e.u, e.v)) {
unite(e.u, e.v);
res += e.cost;
}
}
return res;
}

int main() {

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: