• 初学并查集-1:家族


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

    代码

    var total,n,m:longint;
        father:array[1..10000000]of longint;
        used:array[1..10000000]of boolean;
        i,j,k,x,y:longint;
        yo:boolean;
    
    function find(x:longint):longint;
             begin if father[x]=x
                      then exit(x);
                   father[x]:=find(father[x]);
                   exit(father[x]);
             end;
    
    procedure union(a,b:longint);
              var i,j,k:longint;
              begin father[find(a)]:=find(father[b]);
              end;
    
    
    begin yo:=false;
          fillchar(father,sizeof(father),0);
          fillchar(used,sizeof(used),true);
          readln(total,n,m);
          for i:=1 to total do
              father[i]:=i;
          for i:=1 to n do
              begin readln(x,y);
                    if find(x)<>find(y)
                       then union(x,y);
              end;
          for i:=1 to m do
              begin readln(x,y);
                    if find(x)=find(y)
                        then writeln('Yes')
                        else writeln('No');
              end;
    end.
  • 相关阅读:
    python2.7升python3.2
    SQL-基础学习使用的数据库资料
    SQL-基础学习2--ORDER BY ,DESC,WHERE, BETWEEN,AND ,OR ,IN ,NOT
    SQL-基础学习1--SELECT,LIMIT,DISTINCT,注释
    Python之Django-part 1
    python--文本处理1
    EXTJS4.2——8.Form+gride+linq进行前后端传输
    LINQ的实例
    高级委托使用
    C# 委托
  • 原文地址:https://www.cnblogs.com/spiderKK/p/4221891.html
Copyright © 2020-2023  润新知