您的位置:首页 > 编程语言

等价类 代码实现

2012-12-16 20:02 141 查看
#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
;

length=new int
;

next=new int
;

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]);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: