使用 javac -encoding UTF-8 E1_5_3.java 编译
使用 java E1_5_3 运行
依次输入:
10
9 0
3 4
5 8
7 2
2 1
5 7
0 3
4 2
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class E1_5_3 {
public static void main(String[]args){
//Solve dynamic connectivity problem on StdIn.
int N= StdIn.readInt();
WeightedQuickUnionUF uf=new WeightedQuickUnionUF(N);
while (!StdIn.isEmpty()){
Counter cnt=new Counter();
int p=StdIn.readInt();
int q=StdIn.readInt();
if (uf.connected(p,q,cnt)){
uf.printid();
StdOut.println("Array access times="+cnt.getCnt());
continue;
}
uf.union(p,q,cnt);
uf.printid();
StdOut.print("Array access times="+cnt.getCnt()+"\t");
StdOut.println(p+" "+q);
}
StdOut.println(uf.count()+" components");
}
private static class WeightedQuickUnionUF {
private int[]id; //parent link(site indexed)
private int[]sz; //size of component for roots(site indexed) 只有根节点存储的是树的大小
private int count;//number of component
public WeightedQuickUnionUF(int N){
count=N;
id=new int[N];
for (int i=0;i<N;i++) id[i]=i;
sz=new int[N];
for (int i=0;i<N;i++) sz[i]=1;
}
public int count(){
return count;
}
public boolean connected(int p,int q,Counter counter){
return find(p,counter)==find(q,counter);
}
public int find(int p,Counter counter){
//Follow links to find a root.
while (p!=id[p]){
p=id[p];
counter.add(2);
}
counter.increment();
return p;
}
public void union(int p,int q,Counter counter){
int i=find(p,counter);
int j=find(q,counter);
if (i==q)return;
//Make smaller root point to large one.
if (sz[i]<sz[j]){id[i]=j;sz[j]+=sz[i];counter.add(5);}
else {id[j]=i;sz[i]+=sz[j];counter.add(5);}
count--;
}
public void printid(){
for (int i=0;i<id.length;i++)
StdOut.print(id[i]+" ");
}
}
}
Counter类:
public class Counter {
private int cnt=0;
public int getCnt(){return cnt;}
public void add(int i){
cnt+=i;
}
public void increment(){
cnt++;
}
}