并查集: 用并查集解决,并查集就是用一个数组表示所有点的连接关系,parent[i]=j表示i的父节点是j,建立并查集的过程首先遍历所有连接关系对,对每个关系对执行并集操作,当两个值的根不相等是,添加其中一个根为另一根的父节点,这样两个集合通过这个共同的根连接为一个集合,最后得到的数组中,如果自己的父节点为自己,说明其独立存在,这样就可以找到有多少个连通分量。
import java.util.Scanner;
public class unionSearch {
static int find_root(int x,int[] parent) {
int x_root=x;
while(parent[x_root]!=x_root)
x_root=parent[x_root];
return x_root;
}
static void union_vertice(int a,int b,int[] parent) {
int a_root=find_root(a,parent);
int b_root=find_root(b,parent);
if(a_root!=b_root)
parent[a_root]=b_root;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
int N=sc.nextInt();//村庄数目
if(N<=0) return;
int M=sc.nextInt();//道路条数
// if(M<=0) {
// System.out.println(N-1);
//
// }
int[] parent=new int[N+1];
for(int i=0;i<N+1;i++) parent[i]=i;
int a,b;
for(int i=0;i<M;i++) {
a=sc.nextInt();
b=sc.nextInt();
union_vertice(a,b,parent);
}
int res=0;
for(int i=1;i<N+1;i++) {
if(parent[i]==i)
res++;
}
System.out.println(res-1);
}
}
}