等价类 代码实现
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]);
}
}
#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]);
}
}
相关文章推荐
- asp.net实现C#代码加亮显示
- Win32环境下代码注入与API钩子的实现(转)
- Quartz以及代码实现--可以实现定时器效果
- android 开启自动旋转屏幕的实现代码
- 贴下百度博客自动加好友的简单代码示例!!(c#.net实现)
- FILE__,__LINE__,FUNCTION__实现代码跟踪(转载)
- Python实现的石头剪子布代码分享
- 【数据结构与算法】【查找】插值查找的代码实现
- 快速排序的多种语言代码实现
- JS点击图片弹出文件选择框并覆盖原图功能的实现代码
- Salesforce 代码实现提交审批
- SWT(JFace) 文本编辑器 实现代码
- 在PHP中实现Javascript的escape()函数代码
- 实现解析数据table表最后的点击显示更多数据的代码
- C++ queue的代码实现
- java代码,实现输入编号,输出对应水果的单价~~~~
- 高斯牛顿法 matlab代码实现
- autolayout的使用原理及代码实现
- 代码笔记 | UDP编程实现
- Voxel Space:不到20行代码实现地形渲染