利用并查集来实现判断,方便快捷。
#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;
}