输入:
10
0 1
1 2
2 3
3 4
可产生长为4的路径
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class E1_5_12 {
public static void main(String[]args){
//Solve dynamic connectivity problem on StdIn.
int N= StdIn.readInt();
QuickUFwithPath uf=new QuickUFwithPath(N);
while (!StdIn.isEmpty()){
int p=StdIn.readInt();
int q=StdIn.readInt();
if (uf.connected(p,q)){
uf.printid();
StdOut.println();
continue;
}
uf.union(p,q);
uf.printid();
StdOut.println(" | "+p+" "+q);
}
StdOut.println(uf.count()+" components");
}
}
import edu.princeton.cs.algs4.StdOut;
public class QuickUFwithPath {
private int[]id;//access to component(site indexed)
private int count;//number of components
public QuickUFwithPath(int N){
//Initialize component id array
count=N;
id=new int[N];
for (int i=0;i<N;i++)
id[i]=i;
}
public int count(){
return count;
}
public boolean connected(int p,int q){
return find(p)==find(q);
}
//quick-union
private int find(int p){
//Find root.
int root=p;
while (root!=id[root])root=id[root];
while (id[p]!=root) {//有可能路径没有压缩
int next=id[p];//next node.
id[p] = root;
p=next;
}
return root;
}
public void union(int p,int q){
//Give p and q the same root.
int pRoot=find(p);
int qRoot=find(q);
if (pRoot==qRoot) return;
id[pRoot]=qRoot;
count--;
}
public void printid(){
for (int i=0;i<id.length;i++)
StdOut.print(id[i]+" ");
}
}