在洛谷上CE,在电脑上过了样例......
#include<bits/stdc++.h>
using namespace std;
int p[5010],rank[5010];
void make_set(int x){
p[x]=x;
rank[x]=0;
}
int find_set(int x){
if(x!=p[x])p[x]=find_set(p[x]);
return p[x];
}
void union1(int x,int y){
x=find_set(x);
y=find_set(y);
if(x!=y){
if(rank[x]>rank[y])p[y]=x;
else{
p[x]=y;
if(rank[x]==rank[y])rank[y]++;
}
}
}
bool ask(int x,int y){
x=find_set(x);
y=find_set(y);
if(x==y)return true;
return false;
}
int main(){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++){
make_set(i);
}
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
union1(x,y);
}
for(int i=1;i<=k;i++){
int a,b;
scanf("%d%d",&a,&b);
if(ask(a,b))printf("Yes\n");
else printf("No\n");
}
}