public class UF {
private int [ ] eleAndGroup;
private int count;
public UF ( int N) {
this . count = N;
this . eleAndGroup = new int [ N] ;
for ( int i = 0 ; i < eleAndGroup. length; i++ ) {
eleAndGroup[ i] = i;
}
}
public int count ( ) {
return count;
}
public boolean connected ( int p, int q) {
return find ( p) == find ( q) ;
}
public int find ( int p) {
return eleAndGroup[ p] ;
}
public void union ( int p, int q) {
if ( connected ( p, q) ) return ;
for ( int i = 0 ; i < eleAndGroup. length; i++ ) {
if ( eleAndGroup[ p] == eleAndGroup[ i] ) {
eleAndGroup[ p] = eleAndGroup[ q] ;
}
}
count-- ;
}
public void print ( ) {
for ( int i = 0 ; i < eleAndGroup. length; i++ ) {
System. out. printf ( "%2d" , eleAndGroup[ i] ) ;
}
System. out. println ( ) ;
for ( int i = 0 ; i < eleAndGroup. length; i++ ) {
System. out. printf ( "%2d" , i) ;
}
System. out. println ( ) ;
}
}
优化:
public class UF_Tree {
private int [ ] eleAndGroup;
private int count;
public UF_Tree ( int N) {
this . count = N;
this . eleAndGroup = new int [ N] ;
for ( int i = 0 ; i < eleAndGroup. length; i++ ) {
eleAndGroup[ i] = i;
}
}
public int count ( ) {
return count;
}
public boolean connected ( int p, int q) {
if ( p >= eleAndGroup. length || p < 0 || q >= eleAndGroup. length || q < 0 ) return false ;
return find ( p) == find ( q) ;
}
public int find ( int p) {
if ( p < 0 || p >= eleAndGroup. length) return - 1 ;
while ( true ) {
if ( p == eleAndGroup[ p] ) return p;
p = eleAndGroup[ p] ;
}
}
public void union ( int p, int q) {
if ( p >= eleAndGroup. length || p < 0 || q >= eleAndGroup. length || q < 0 ) return ;
int pGroup = find ( p) ;
int qGroup = find ( q) ;
if ( pGroup == qGroup) return ;
eleAndGroup[ pGroup] = qGroup;
count-- ;
}
}
优化—路径压缩
public class UF_Tree_2 {
private int [ ] eleAndGroup;
private int count;
private int [ ] sz;
public UF_Tree_2 ( int N) {
this . count = N;
this . eleAndGroup = new int [ N] ;
for ( int i = 0 ; i < eleAndGroup. length; i++ ) {
eleAndGroup[ i] = i;
}
this . sz = new int [ N] ;
for ( int i = 0 ; i < sz. length; i++ ) {
this . sz[ i] = 1 ;
}
}
public int count ( ) {
return count;
}
public boolean connected ( int p, int q) {
if ( p >= eleAndGroup. length || p < 0 || q >= eleAndGroup. length || q < 0 ) return false ;
return find ( p) == find ( q) ;
}
public int find ( int p) {
if ( p < 0 || p >= eleAndGroup. length) return - 1 ;
while ( true ) {
if ( p == eleAndGroup[ p] ) return p;
p = eleAndGroup[ p] ;
}
}
public void union ( int p, int q) {
if ( p >= eleAndGroup. length || p < 0 || q >= eleAndGroup. length || q < 0 ) return ;
int pGroup = find ( p) ;
int qGroup = find ( q) ;
if ( pGroup == qGroup) return ;
if ( sz[ pGroup] < sz[ qGroup] ) {
eleAndGroup[ pGroup] = qGroup;
sz[ qGroup] += sz[ pGroup] ;
} else {
eleAndGroup[ qGroup] = pGroup;
sz[ pGroup] += sz[ qGroup] ;
}
count-- ;
}
}
练习:畅通工程
public class Exercise_UF {
public static void main ( String[ ] args) throws IOException {
BufferedReader br = new BufferedReader ( new InputStreamReader ( new FileInputStream ( "trffic_project.txt" ) ) ) ;
Integer cities = Integer. parseInt ( br. readLine ( ) ) ;
UF_Tree_2 uf = new UF_Tree_2 ( cities) ;
Integer has_road = Integer. parseInt ( br. readLine ( ) ) ;
for ( Integer i = 0 ; i < has_road; i++ ) {
String line = br. readLine ( ) ;
String[ ] arr = line. split ( " " ) ;
int p = Integer. parseInt ( arr[ 0 ] ) ;
int q = Integer. parseInt ( arr[ 1 ] ) ;
uf. union ( p, q) ;
}
System. out. println ( "还需要再修:" + ( uf. count ( ) - 1 ) + "条道路才可以完成畅通工程。" ) ;
br. close ( ) ;
}
}