Files
UnrealEngineUWP/Engine/Source/Developer/MeshUtilitiesCommon/Public/DisjointSet.h
Chris Gagnon 8fc25ea18e Merging //UE4/Dev-Main to Dev-Editor (//UE4/Dev-Editor)
#rb none

[CL 4676797 by Chris Gagnon in Dev-Editor branch]
2019-01-02 14:54:39 -05:00

83 lines
1.2 KiB
C++

// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
class FDisjointSet
{
public:
FDisjointSet( const uint32 Size );
void Union( uint32 x, uint32 y );
uint32 Find( uint32 i );
uint32 operator[]( uint32 i ) const { return Parents[i]; }
private:
TArray< uint32 > Parents;
};
FDisjointSet::FDisjointSet( const uint32 Size )
{
Parents.SetNumUninitialized( Size );
for( uint32 i = 0; i < Size; i++ )
{
Parents[i] = i;
}
}
// Union with splicing
void FDisjointSet::Union( uint32 x, uint32 y )
{
while( Parents[x] != Parents[y] )
{
// Pick larger
if( Parents[x] < Parents[y] )
{
uint32 p = Parents[x];
Parents[x] = Parents[y];
if( x == p )
{
return;
}
x = p;
}
else
{
uint32 p = Parents[y];
Parents[y] = Parents[x];
if( y == p )
{
return;
}
y = p;
}
}
}
// Find with path compression
uint32 FDisjointSet::Find( uint32 i )
{
// Find root
uint32 Start = i;
uint32 Root = Parents[i];
while( Root != i )
{
i = Root;
Root = Parents[i];
}
// Point all nodes on path to root
i = Start;
uint32 Parent = Parents[i];
while( Parent != Root )
{
Parents[i] = Root;
i = Parent;
Parent = Parents[i];
}
return Root;
}