数组实现的并查集:
int par[MAX]//父亲 集合的首元来代表整个集合;
int rank[MAX]//树的深度;
void init(int n)
{
for(int i=0; i<n; i++)// 初始化
{
par[i] = i;
rank[i] = 0;
}
int find(int x)// 查找树的根
{
if(par[x] == x) return par[x];
else
return par[x] = find(par[x]);
}
void union(int x, int y)//合并
{
x = find(x);
y = find(y);
if(x == y) return;
if(rank[x]<rank[y])
par[x] = y;
else
{
par[y] = x;
if( rank[x] == rank[y]) rank[x]++;
}
}
bool same(int x, int y)//是否在同一根
return find[x] == find[y];
}