使用 javac -encoding UTF-8 E1_5_1.java 编译
使用 java E1_5_1 运行
依次输入:
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_1 {
public static void main(String[]args){
//Solve dynamic connectivity problem on StdIn.
int N= StdIn.readInt();
UF uf=new UF(N);
while (!StdIn.isEmpty()){
int cnt=0;
int p=StdIn.readInt();
int q=StdIn.readInt();
cnt+=2;//connected访问两次
if (uf.connected(p,q)){
uf.printid();
StdOut.println("Array access times="+cnt);
continue;
}
//到这一步表明p,q不连接,肯定执行union操作
cnt+=2*N+2;
uf.union(p,q);
uf.printid();
StdOut.print("Array access times="+cnt+"\t");
StdOut.println(p+" "+q);
}
StdOut.println(uf.count()+" components");
}
private static class UF {
private int[] id;//access to component(site indexed)
private int count;//number of components
public UF(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-find
public int find(int p) {
return id[p];
}
public void union(int p, int q) {
//Put p and q into the same component.
int pID = find(p);
int qID = find(q);
//Nothing to do if p and q are already in the same component.
if (pID == qID) return;
//Rename p's component to q's name.
for (int i = 0; i < id.length; i++)
if (id[i] == pID)
id[i] = qID;
count--;
}
public void printid(){
for (int i=0;i<id.length;i++)
StdOut.print(id[i]+" ");
}
}
}