You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
TArray::Init use replaced with SetNumUninitialized. #codereview robert.manuszewski [CL 2495011 by Steve Robb in Main branch]
80 lines
1.2 KiB
C++
80 lines
1.2 KiB
C++
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
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;
|
|
} |