题目背景:
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
题目描述:
规定:x 和 y 是亲戚,y 和 z 是亲戚,那么 x 和 z 也是亲戚。如果 x,y 是亲戚,那么 x 的亲戚都是 y 的亲戚,y 的亲戚也都是 x 的亲戚。
输入:
第一行:三个整数 n,m,p,(n,m,p≤5000),分别表示有 n 个人,m 个亲戚关系,询问 p 对亲戚关系。
以下 m 行:每行两个数 Mi,Mj,1≤Mi, Mj≤n,表示 Mi 和 Mj 具有亲戚关系。
接下来 p 行:每行两个数Pi,Pj,询问 Pi 和 Pj 是否具有亲戚关系。、
输出:p 行,每行一个 Yes
或 No
。表示第 i 个询问的答案为“具有”或“不具有”亲戚关系
import java.io.*;
import java.util.*;
public class Main{
static int[] fa = new int[5005];
static int[] rank=new int[5005];
public static void main(String[] args){
quickin in=new quickin();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
int n= in.nextInt();;
int m= in.nextInt();
int p= in.nextInt();
init(n);
for(int i=0;i<m;i++){
int x=in.nextInt();
int y=in.nextInt();
merge(x,y);
}
for(int i=0;i<p;i++){
int xx=in.nextInt();
int yy=in.nextInt();
pw.println(find(xx)==find(yy)?"Yes":"No");
pw.flush();
}
}
public static void init(int n){
for(int i=1;i<=n;i++){
fa[i]=i;
rank[i]=1;
}
}
public static int find(int x){
if(x==fa[x]){
return x;
}else{
fa[x]=find(fa[x]);
return fa[x];
}
}
public static void merge(int i,int j){
int x=find(i);
int y=find(j);
if(rank[x]<=rank[y]){
fa[x]=y;
}else{
fa[y]=x;
}
if(rank[x]==rank[y]&&x!=y){
rank[y]++;
}
}
}
class quickin{
BufferedReader br;
StringTokenizer st;
quickin(){
br = new BufferedReader(new InputStreamReader(System.in));
}
boolean hasNext(){
while(st==null||!st.hasMoreElements()){
try{
st=new StringTokenizer(br.readLine());
}catch(Exception e){
return false;
}
}
return true;
}
String next(){
if(hasNext()) return st.nextToken();
return null;
}
int nextInt(){
return Integer.parseInt(next());
}
}