一、UniteFind.h源码
#pragma once
#include "stdafx.h"
class UniteFind
{
private :
int* nodeRoot;
int* treeHeight;
int nodeNum;
int findRoot(int node)
{
while (nodeRoot[node] != node)
{
node = nodeRoot[node];
}
return node;
}
public:
UniteFind(int n)
{
nodeRoot = new int[n];
treeHeight = new int[n];
for(int i=0; i<n; i++)
{
nodeRoot[i] = i;
treeHeight[i] = 0;
}
nodeNum = n;
}
~UniteFind()
{
delete[] nodeRoot;
delete[] treeHeight;
nodeRoot = nullptr;
treeHeight = nullptr;
}
void unite(int a, int b)
{
if(a==b || a <0 || a>=nodeNum || b <0 || b>=nodeNum)
{
return;
}
int aRoot = findRoot(a);
int bRoot = findRoot(b);
if(treeHeight[aRoot] < treeHeight[bRoot])
{
nodeRoot[aRoot] = bRoot;
}
else
{
nodeRoot[bRoot] = aRoot;
if(treeHeight[aRoot] == treeHeight[bRoot])
{
aRoot++;
}
}
}
bool isOneUnite(int a, int b)
{
if(a==b || a <0 || a>=nodeNum || b <0 || b>=nodeNum)
{
return false;
}
return findRoot(a) == findRoot(b);
}
int getUniteNum()
{
int num = 0;
for(int i=0;i<nodeNum; i++)
{
if(nodeRoot[i] == i)
{
num++;
}
}
return num;
}
};
二、UniteFindTest.h源码
#pragma once
#include "stdafx.h"
#include "UniteFind.h"
class UniteFindTest
{
public:
void doTest()
{
UniteFind unitFind(10)
unitFind.unite(0,3)
unitFind.unite(2,4)
unitFind.unite(2,3)
unitFind.unite(5,7)
unitFind.unite(6,8)
unitFind.unite(9,6)
cout << (unitFind.isOneUnite(2,0)?"true":"false") <<endl
cout << (unitFind.isOneUnite(3,5)?"true":"false") <<endl
cout << unitFind.getUniteNum() << endl
}
}