• 1073 家族


    1073 家族

     时间限制: 1 s

     空间限制: 128000 KB
     题目等级 : 大师 Master
     
     
    题目描述 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<cstdio>
     2 const int N=5010;
     3 
     4 
     5 int n,m,k;
     6 int far[N]; 
     7 int find(int a)
     8 {
     9     if(a!=far[a])far[a]=find(far[a]);
    10     return far[a];
    11 }
    12 int main()
    13 {
    14     scanf("%d%d%d",&n,&m,&k);
    15     for(int i=1;i<=n;++i)far[i]=i;
    16     for(int i=1;i<=m;++i)
    17     {
    18         int a,b;
    19         scanf("%d%d",&a,&b);
    20         int r=find(a);
    21         int rr=find(b);
    22         if(rr!=r)far[rr]=r;
    23     }
    24     for(int i=1;i<=k;++i)
    25     {
    26         int a,b;
    27         scanf("%d%d",&a,&b);
    28         if(find(a)==find(b))printf("Yes
    ");
    29         else printf("No
    ");
    30     }
    31     return 0;
    32 }
  • 相关阅读:
    luogu P1486 [NOI2004]郁闷的出纳员
    Luogu P1894 [USACO4.2]The Perfect Stall
    关于中间6个月停更通知
    Luogu P1381油滴扩展
    没有上司的舞会(题解)
    幂的模运算(题解)
    闭合区域面积统计(题解)
    字符序列(题解)
    最大连续和(题解)
    排列问题
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6746850.html
Copyright © 2020-2023  润新知