《蓝桥杯每日一题》并查集·AcWing1249. 亲戚

简介: 《蓝桥杯每日一题》并查集·AcWing1249. 亲戚

1.题目描述


或许你并不知道,你的某个朋友是你的亲戚。


他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。


如果能得到完整的家谱,判断两个人是否是亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系实非人力所能及。


在这种情况下,最好的帮手就是计算机。


为了将问题简化,你将得到一些亲戚关系的信息,如Marry和Tom是亲戚,Tom和Ben是亲戚,等等。


从这些信息中,你可以推出Marry和Ben是亲戚。


请写一个程序,对于我们的关于亲戚关系的提问,以最快的速度给出答案。


输入格式


输入由两部分组成。

第一部分以 N,M 开始。N 为问题涉及的人的个数。这些人的编号为 1,2,3,…,N。下面有 M 行,每行有两个数 ai,bi,表示已知 aibi是亲戚。


第二部分以 Q开始。以下 Q 行有 Q 个询问,每行为 ci,di,表示询问 ci 和 di 是否为亲戚。


第二部分以 Q开始。以下 Q 行有 Q 个询问,每行为 ci,di,表示询问 cidi 是否为亲戚。


输出格式


对于每个询问 ci,di,输出一行:若 cidi 为亲戚,则输出“Yes”,否则输出“No”。


数据范围


1≤N≤20000


1≤M≤10的六次方


1≤Q≤10的六次方


输出样例:


YesNoYes

2.思路分析


我们先初始化p数组


然后输入m个数


我们查询一下,如果root1(find(a),即a的根节点)不是root2(find(b),即b的根节点),我们就把它们连接起来


最后输入q个数判断一下就行了,如果它们都是一个祖宗,我们就输出Yes,反之输出No


注意用BufferedReader和BufferedWriter优化一下输入输出,不然会超时


关于快速输入可以看一下我的这篇博客


https://blog.csdn.net/m0_68055637/article/details/128551437


3.Ac代码


import java.io.*;
public class Main {
    static int N=20010;
    static int []p=new int[N]; //存储每个点的祖宗节点
    public static void main(String[] args) throws IOException {
        BufferedReader  br=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter  bw=new BufferedWriter(new OutputStreamWriter(System.out));
        String []s=br.readLine().split(" ");
        int n=Integer.parseInt(s[0]),m=Integer.parseInt(s[1]);
        for (int i = 0; i < n; i++) {
            p[i]=i;
        }
        while (m-->0){
            s=br.readLine().split(" ");
        int a=Integer.parseInt(s[0]),b=Integer.parseInt(s[1]);
        int root1=find(a),root2=find(b); //分别找到两个人的祖宗节点,并判断是不是亲戚
        if(root1!=root2)  p[root1]=root2;      //如果不是,添加至同族
        }
        int t=Integer.parseInt(br.readLine());
        while (t-->0){
            s=br.readLine().split(" ");
            int a=Integer.parseInt(s[0]),b=Integer.parseInt(s[1]);
            bw.write(find(a)==find(b)?"Yes":"No");
            bw.newLine(); //换行
        }
        bw.flush();  //输出缓冲区才能输出
    }
    private static int find(int x) {
        if(p[x]!=x)  p[x]=find(p[x]);
        return p[x];
    }
}

感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下

相关文章
|
算法
算法 - 蓝桥杯并查集题型
算法 - 蓝桥杯并查集题型
|
存储 人工智能 BI
【蓝桥杯集训·每日一题】AcWing 1249. 亲戚
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 并查集
92 0
|
机器学习/深度学习 人工智能 Python
蓝桥杯 修改数组 python (并查集)
蓝桥杯 修改数组 python (并查集)
蓝桥杯 修改数组 python (并查集)
|
算法 Python
Python之并查集 洛谷 蓝桥杯
Python之并查集 洛谷 蓝桥杯
231 0
Python之并查集 洛谷 蓝桥杯
【蓝桥杯】考前押题--并查集
🎉考前冲刺🎉 🎠1、合根植物 🎏2、亲戚 🧵3、七段码
【蓝桥杯】考前押题--并查集
蓝桥杯——修改数组(思维+并查集)
蓝桥杯——修改数组(思维+并查集)
119 0
|
算法 Python
Python之并查集 洛谷 蓝桥杯(2)
Python之并查集 洛谷 蓝桥杯
158 0
Python之并查集 洛谷 蓝桥杯(2)
|
Python
Python之并查集 洛谷 蓝桥杯(1)
Python之并查集 洛谷 蓝桥杯
225 0
Python之并查集 洛谷 蓝桥杯(1)
|
6月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
107 0