zoukankan      html  css  js  c++  java
  • p1304 家族

    描述

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

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

    格式

    输入格式

    第一行:三个整数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是否具有亲戚关系。

    输出格式

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

    样例1

    样例输入1[复制]

    6 5 3
    1 2
    1 5
    3 4
    5 2
    1 3
    1 4
    2 3
    5 6

    样例输出1[复制]

    Yes
    Yes
    No

    并查集水题
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    typedef long long ll;
    #define N 100007
    #define INF 0x3f3f3f3f
    using namespace std;
    int parent[N];
    int findset(int x)
    {
        if(x!=parent[x])
            parent[x]=findset(parent[x]);
        return parent[x];
    }
    void unio(int a,int b)
    {
        int x=findset(a);
        int y=findset(b);
        parent[x]=y;
    }
    int main()
    {
        int n,m,p;
        scanf("%d%d%d",&n,&m,&p);
        int i,x,y;
        for(i=0;i<=n;i++)
            parent[i]=i;
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            unio(x,y);
        }
        for(i=1;i<=p;i++)
        {
            scanf("%d%d",&x,&y);
            if(findset(x)==findset(y))
                printf("Yes
    ");
            else
                printf("No
    ");
        }
    
    }
    
  • 相关阅读:
    C风格字符串大写转小写
    指针的引用在函数中的应用
    Debug和Release区别
    差分约束系统(System Of Difference Constraints)
    poj_2299UltraQuickSort && poj_1804Brainman
    计算几何基础——矢量和叉积
    推荐ALGORITHM专题
    后缀数组之倍增法
    静态邻接表的简单实现
    归并排序&&树状数组求逆序数
  • 原文地址:https://www.cnblogs.com/Aa1039510121/p/5903748.html
Copyright © 2011-2022 走看看