用来解决动态连通性的算法
期望效果:程序读取整数对pq时候,如果不相连,输出这一对, 相连,程序忽略这一对开始处理下一对
import java.util.Scanner;
//加权union-find算法的实现P158
public class QuickUnion {
private int[] id;//父链接数组
private int[] sz;//各个根节点所对应的分量大小
private int count;//连通分量的数量
//构造函数实现初始化
public QuickUnion(int N) {
count=N;
//初始化每个触点对应的值
id=new int[N];
for (int i = 0; i < N; i++) id[i]=i;
//初始化每个节点对应的分量为1
sz=new int[N];
for (int i = 0; i < N; i++) sz[i]=1;
}
public int count() {
return count;
}
private int find(int p) {
//跟随链接找到根节点
while (p!=id[p]) p=id[p];
return p;
}
//判断两个是否连通
public boolean connected(int p,int q) {
return find(p)==find(q);
}
public void union(int p,int q) {
int i=find(p);
int j=find(q);
if (i==j) return;
//将小树的根节点链接到大树的根节点
if (sz[i]<sz[j]) {
id[i]=j;sz[j]+=sz[i];
} else {
id[j]=i;sz[i]+=sz[j];
}
count--;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入数量");
int N=scanner.nextInt();
QuickUnion quickUnion=new QuickUnion(N);
while (scanner.hasNext()) {
int p=scanner.nextInt();
int q=scanner.nextInt();
if (quickUnion.connected(p, q)) continue;
quickUnion.union(p, q);
System.out.println(p+" "+q);
}
System.out.println(quickUnion.count()+"components");
}
}