定义API
UF(int N) 整数标识N个触点
union(int p,int q) 在P Q中添加一条连接
connected(int p,int q) 判断两个触点是否连接
count() 连通分量的数量
初始化矩阵为
0 1 2 3 4 5 6 7 8 9
第一次归并
第二次
第三次
代码实现
package Mr_math;
import java.util.Random;
import java.util.Scanner;
public class UF {
private int id[]; //触点标识
private int count; //分量的多少
public UF(int N) { //初始化连通问题
id = new int[N];
count = N;
for(int i=0;i<N;i++) id[i]=i;
}
public int count() { //获取当前分量
return count;
}
public boolean connected(int p,int q) { //判断两个触点是否连接
return quick_find(p)==quick_find(q);
}
public int quick_find(int number) {
return id[number];
}
public void union(int p,int q) { //归并
int pInt = quick_find(p);
int qInt = quick_find(q);
if (pInt ==qInt) {
return;
}
for(int i=0;i<id.length;i++) {
if(id[i] == pInt) {
id[i] = qInt;
}
}
count--;
}
public void see() {
System.out.println("矩阵情况:");
for(int i=0;i<id.length;i++) {
System.out.print(id[i]+" ");
}
}
public static void main(String []args) {
/*
* Scanner out = new Scanner(System.in); System.out.print("输入:");
*/
Random out = new Random();
int p;
int q;
int N= 10;
UF uf =new UF(N);
int count=0;
while(uf.count != N-9) {
p = out.nextInt(10);
q = out.nextInt(10);
uf.union(p, q);
if(count !=uf.count) { //归并后,count--,每次状态发生变化,打印在控制台
System.out.println();
System.out.println("p="+p+" , q="+q);
System.out.println("count:"+uf.count());
uf.see();
count = uf.count;
}
}
}
}