基本算法
#include<iostream>
using namespace std;
#define N 10
int parent[N]; //记录每个节点的父节点是谁,parent[i] = j 代表i的父节点是j
int find(int x) //寻找元素所在集合 返回根结点
{
//根结点的父节点是它本身
//路径压缩
return parent[x] == x? x : parent[x] = find(parent[x]);
}
void Union(int x1,int x2) //合并
{
//查找元素的根结点
int p1 = find(x1);
int p2 = find(x2);
if(p1 != p2)
parent[p1] = p2;
}
bool is_same(int x1,int x2) //是否在同一个集合中
{
return find(x1) == find(x2);
}
int main()
{
//初始化每个根结点为本身
for(int i = 0; i < N; i++) parent[i] = i;
}
2、优化算法 (按秩归并)
#include<iostream>
using namespace std;
#define N 10
int parent[N];
int find(int x) //寻找元素所在集合 返回根结点
{
//根结点的父节点是-1
//先比较元素的父节点是否等于-1,如果是则找到了根结点
// if(parent[x] == -1) return x
// else return find(parent[x]);
//路径压缩
return parent[x] < 0 ? x : parent[x] = find(parent[x]);
}
void Union(int x1,int x2) //将元素少的子集并入元素多的子集 算法优化
{
//查找元素的根结点
int p1 = find(x1);
int p2 = find(x2);
//根结点的parent为负数,绝对值表示元素个数
//比规模
if(parent[p1] < parent[p2]){
//p1元素个数多
parent[p1] += parent[p2]; //元素个数
parent[p2] = p1;
}else{ //p2元素个数多
parent[p2] += parent[p1];
parent[p1] = p2;
}
//比高度
// if(parent[p1] < parent[p2]){ //p1高
// parent[p2] = p1;
// }else{ //p2高 或者相等
// if(parent[p1] == parent[p2]) parent[p1] --;
// parent[p1] = p2;
// }
}
bool is_same(int x1,int x2) //是否在同一个集合中
{
return find(x1) == find(x2);
}
int main()
{
//初始化每个根结点都是-1
for(int i = 0; i < N; i++) parent[i] = -1;
//赋值 只有根结点为-1
}