等价类 代码实现

#include "StdAfx.h"
#include "UFSets.h"


#include<iostream>
using namespace std;
void UFSets::swap(int& a,int& b)
{
int i;
i=a;
a=b;
b=i;
}


UFSets::UFSets(int size)
{
n=size;
root=new int[n];
length=new int[n];
next=new int[n]; 
for(int i=0;i<n;i++)
{
root[i]=next[i]=i;//各元素独自成为一个等价类
length[i]=1;
}


}


UFSets::~UFSets(void)
{
delete []root;
delete []length;
delete []next;
}


int UFSets::find(int v)
{
return root[v];
}


void UFSets::Union(int v,int u)
{
int rtv=root[v];//获取v所在等价类的代表元
int rtu=root[u];//获取u所在等价类的代表元


if(rtv==rtu)//如果v和u在一个等价类中则返回
return;
else if(length[rtv]<length[rtu])//将v所在等价类合并到u所在等价类,以u等价类的代表元为新等价类代表元
{
length[rtu]+=length[rtv];
root[rtv]=rtu;//将v所在等价类中所有元素的代表元素置为rtu
for(int i=next[rtv];i!=rtv;i=next[i])
{
root[i]=rtu;
}
swap(next[rtv],next[rtu]);//rtv和rtu交换位置,rtv的下一个是原来rtu里的元素,rtu的下一个是原来rtv里的元素
}
else if(length[rtv]>=length[rtu])/*将u所在等价类合并到v所在等价类,以v等价类的代表元为新等价类代表元*/
{
length[rtv]+=length[rtu];
root[rtu]=rtv;
for(int i=next[rtu];i!=rtu;i=next[i])
{
root[i]=rtv;
}
swap(next[rtu],next[rtv]);
}
}

猜你喜欢

转载自blog.csdn.net/qingshimingyue1992/article/details/8302359