模板1
class UnionFind {
int [ ] parent;
int [ ] size;
int n;
int setCount;
public UnionFind ( int n) {
this . n = n;
this . setCount = n;
this . parent = new int [ n] ;
this . size = new int [ n] ;
Arrays. fill ( size, 1 ) ;
for ( int i = 0 ; i < n; ++ i) {
parent[ i] = i;
}
}
public int findset ( int x) {
return parent[ x] == x ? x : ( parent[ x] = findset ( parent[ x] ) ) ;
}
public boolean unite ( int x, int y) {
x = findset ( x) ;
y = findset ( y) ;
if ( x == y) {
return false ;
}
if ( size[ x] < size[ y] ) {
int temp = x;
x = y;
y = temp;
}
parent[ y] = x;
size[ x] += size[ y] ;
-- setCount;
return true ;
}
public boolean connected ( int x, int y) {
x = findset ( x) ;
y = findset ( y) ;
return x == y;
}
}
模板二
private class UnionFind {
private int [ ] parent;
private int count;
public int getCount ( ) {
return count;
}
public UnionFind ( int n) {
this . count = n;
this . parent = new int [ n] ;
for ( int i = 0 ; i < n; i++ ) {
parent[ i] = i;
}
}
public int find ( int x) {
while ( x != parent[ x] ) {
parent[ x] = parent[ parent[ x] ] ;
x = parent[ x] ;
}
return x;
}
public void union ( int x, int y) {
int rootX = find ( x) ;
int rootY = find ( y) ;
if ( rootX == rootY) {
return ;
}
parent[ rootX] = rootY;
count-- ;
}
}
}
最简洁的模板
for ( int i = 1 ; i <= n; i ++ ) fa[ i] = i; \\并查集初始化
public static int find ( int x) {
return x== fa[ x] ? x : ( fa[ x] = find ( fa[ x] ) ) ;
}
public static void union ( int x, int y) {
fa[ find ( x) ] = find ( y) ;
}