5929 亲戚

5929 亲戚

 

时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
 
 
 
题目描述 Description

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。

规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。 

输入描述 Input Description

第一行:三个整数n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。

以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Ai和Bi具有亲戚关系。

接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。

 

输出描述 Output Description

P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。

样例输入 Sample Input
6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6

 

样例输出 Sample Output
Yes
Yes
No

 

数据范围及提示 Data Size & Hint

题目中已有,不重复解释

 

 1 #include<cstdio>
 2 int far[5010];
 3 int n,m,q;
 4 int find(int x)  
 5 {
 6     if(x!=far[x])far[x]=find(far[x]);  //并查集优化 
 7     return far[x];
 8 }
 9 int unin(int a,int b)
10 {
11     far[b]=a;
12 }
13 int main()
14 {
15     scanf("%d%d%d",&n,&m,&q);
16     for(int i=1;i<=n;++i)
17         far[i]=i;  
18     for(int i=1;i<=m;++i)
19     {
20         int x,y;
21         scanf("%d%d",&x,&y);
22         int r=find(x);
23         int rr=find(y);
24         if(r!=rr)unin(r,rr);
25     }
26     for(int i=1;i<=q;++i)
27     {
28         int x,y;
29         scanf("%d%d",&x,&y);
30         if(find(x)==find(y))printf("Yes\n");
31         else printf("No\n");
32     }
33     return 0;
34 }

 

posted @ 2017-04-12 16:32  MJT12044  阅读(166)  评论(0编辑  收藏  举报