import java.util.Scanner;
public class Main{
int[] father;
int[] rank;
public Main(){
}
public void go(){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
father=new int[n+1];
rank=new int[n+1];
Make_Set();
for(int i=1;i<=m;i++){
int a=in.nextInt();
int b=in.nextInt();
int x=Find_Set(a);
int y=Find_Set(b);
Union(x,y);
}
//for(int i=1;i<=n;i++)
// System.out.print("father["+i+"]="+father+" ");
int k=in.nextInt();
for(int i=1;i<=k;i++){
int x=in.nextInt();
int y=in.nextInt();
if(Find_Set(x)==Find_Set(y)) System.out.println("Yes");
else System.out.println("No");
}
}
private int Find_Set(int x){
if (x != father[x]){
father[x] = Find_Set(father[x]);//这个回溯时的压缩路径是精华,将查找路径的所有节点都指向根节点
}
return father[x];
}
void Union(int x, int y){
int f1 = Find_Set(x);
int f2 = Find_Set(y);
if(f1!=f2) father[f1]=f2;
}
public static void main(String args[]){
Main m=new Main();
m.go();
}
}[/code] 作者: 雪飞舞舞 时间: 2017-3-10 17:53
看看。。。。。