zoukankan      html  css  js  c++  java
  • 洛谷-P1551 亲戚

    题目背景

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

    题目描述

    规定: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,表示Mi和Mj具有亲戚关系。

    接下来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
    Yes
    Yes
    No

    说明/提示

    非常简单的并查集入门题哦!!!

    题目分析

    亲戚的亲戚是亲戚吧(就像你不认识你的七大姑八大爷,但是他们认识你妈,你不可能不认识你妈吧),所以有亲戚关系的人在就放在同一个集合,他们都有同一个“祖宗”。

    对于每一个测试案例,只需要判断他们是不是同一个“祖宗“即可判断是不是亲戚了。

    可行代码

    #include <iostream>
    using namespace std;
    
    void init(int n, int *fa) {
        for (int i = 1; i <= n; ++i)
            fa[i] = i;
        return;
    }
    
    int find(int x, int *fa) {
        if (x == fa[x])
            return x; // 如果x的父亲就是x那么就是找到了x的祖先节点
        return find(fa[x], fa); // 递归返回
    }
    
    void merge(int a, int b, int *fa) {
        a = find(a, fa);
        b = find(b, fa);
        if (a != b)
            fa[b] = a; // 如果两个元素不相等就让一个元素成为另一个元素的父节点
        return;
    }
    
    int main() {
        int person, relation, ask;
        cin >> person >> relation >> ask;
        int PR[person + 1];// 角标是从 1开始
        init(person, PR);
        while (relation--) {
            int relative1, relative2;
            cin >> relative1 >> relative2;
            merge(relative1, relative2, PR);
        }
        while (ask--) {
            int person1, person2;
            cin >> person1 >> person2;
            int ancestor1 = find(person1, PR);// 找祖宗
            int ancestor2 = find(person2, PR);
            if (ancestor1 == ancestor2)
                cout << "Yes" << endl;
            else
                cout << "No" << endl;
        }
        return 0;
    }

    END 感谢reader's阅读,洛谷题目链接:P1551 亲戚 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  • 相关阅读:
    插入排序(C语言版)
    2015蓝桥杯分机号(C++C组)
    2015蓝桥杯二项式
    2016蓝桥杯报纸页数(C++C组)
    区块链
    C语言学生管理系统完善版
    数据结构队列
    C语言数据结构队列
    C语言数据结构栈
    javascript 事件
  • 原文地址:https://www.cnblogs.com/kirk-notes/p/15001438.html
Copyright © 2011-2022 走看看