由于我使用并查集来解决Kruskal算法(最小生成树),至于并查集的定义我并不是特别熟悉,看下面的并查集的实现过程应该对并查集有所了解。
并查集在Kruskal中的作用, 用来判断某两个顶点连接起来判断这棵树是否构成环。
下面是我自己用C++将并查集封装成一个类。
#include<iostream>
#define max 10
using namespace std;
class Union{
public:
int parent[max];
int rank[max];//rank[i]表示 i节点的根节点的层数
Union(int v){//v为并查集大小
for(int i = 0; i < v; i++){
parent[i] = i;
rank[i] = 1;
}
}
int find(int p){//查找某节点的根节点
if(p >= max || p < 0) return -1;
while(p != parent[p]){//说明已经找到根节点了
parent[p] = parent[parent[p]];
p = parent[p];
}
return p;
}
bool isConnected(int p, int q){//判断两点是否相连
return find(p) == find(q);
}
void unionele(int p, int q){//将两个顶点连接起来
int p_root = find(p);
int q_root = find(q);
if(p_root == q_root) return;
if(rank[p_root] > rank[q_root]){
parent[q_root] = p_root;
}
else if(rank[p_root] < rank[q_root]){
parent[p_root] = q_root;
}
else{
parent[q_root] = p_root;
rank[p_root]++;
}
}
};