zoukankan      html  css  js  c++  java
  • 初学并查集-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.
  • 相关阅读:
    JS键盘码值表
    JS入门笔记
    CSS居中的方法总结
    CSS布局模型思考
    条件、循环、函数定义、字符串操作练习
    Python输入输出练习,运算练习,turtle初步练习
    如何理解Comparator接口中的升降序?
    12个非常实用的JavaScript小技巧
    JAVA泛型知识(一)
    开窗函数简介
  • 原文地址:https://www.cnblogs.com/spiderKK/p/4221891.html
Copyright © 2011-2022 走看看