1073 家族(并查集模板)

﹏ヽ暗。殇╰゛Y 2022-06-15 00:37 277阅读 0赞

题目描述 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

n<=5000,m<=5000,p<=5000

  1. #include<iostream>
  2. #include<string.h>
  3. #include<cstdio>
  4. using namespace std;
  5. int pre[30000];
  6. int n,m,p;
  7. void init()
  8. {
  9. for (int i=1; i<=n; i++)
  10. {
  11. pre[i] = -1;
  12. }
  13. }
  14. int find(int num)
  15. {
  16. while (pre[num]>-1)
  17. {
  18. num = pre[num];
  19. }
  20. return num;
  21. }
  22. void union_set(int x, int y)
  23. {
  24. int xx = find(x);
  25. int yy = find(y);
  26. if (xx != yy)
  27. {
  28. pre[xx] += pre[yy];
  29. pre[yy] = xx;
  30. }
  31. }
  32. int main()
  33. {
  34. scanf("%d%d%d",&n,&m,&p);
  35. init();
  36. int x, y;
  37. while (m--)
  38. {
  39. scanf("%d%d",&x,&y);
  40. union_set(x,y);
  41. }
  42. while (p--)
  43. {
  44. scanf("%d%d",&x,&y);
  45. if (find(x) == find(y))
  46. {
  47. cout<<"Yes"<<endl;
  48. }else{
  49. cout<<"No"<<endl;
  50. }
  51. }
  52. return 0;
  53. }

发表评论

表情:
评论列表 (有 0 条评论,277人围观)

还没有评论,来说两句吧...

相关阅读

    相关 (模板)

    并查集(模板) [来源][Link 1] 并查集:将不同分散的结点,通过某种关系将他们连接成一个森林 并查集分为3步: 1. 并:给出两点关系,如果属于同

    相关 Vijos P1034家族【基础

    P1034家族 未递交 标签: \[显示标签\] 描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否

    相关

    森林: 森林是由若干棵互不相交的树组成,两棵树分别独立,没有交集 ![20181112082744488.png][] 并查集: 并查集的结构和森林十分相似,是

    相关

    来看一个实例,[杭电1232畅通工程][1232] 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性