Java实现并查集示例详解

 更新时间:2021年12月11日 11:06:12   作者:水公子  
这篇文章主要通过一个题目示例为大家详细介绍Java如何实现并查集,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

题目

题目背景

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

思路

对于该题而言,考察的是并查集,也就是小怪兽逐个找上级领导的思路,指导找到最终的Boss停止下来,如果两个怪兽要打架,需要问一问他们的上级领导,领导再问领导,逐级向上,最终发现它们属于同一个Boss的部署的话就不能再打架了,这道题同样的思路,如果斗罗大陆的一开始白沉香不知道唐三是亲戚的话,他们就会先询问自己的祖辈,而白沉香通过她爷爷得知她和唐三有亲戚,那么他们就不会再打起来,而是会联盟,一起去打别的敌人,同样,我的亲戚是你,你的亲戚是她,那么我和她也就会是亲戚,就像老家里你堂哥是你亲戚,你堂哥和他姥爷是亲戚,那么你就和他姥爷是亲戚

find实现

这个find就是用来查找他们的上级的,初始化时小怪兽高兴坏了,认为自己就是自己的上司,我就是王,我就是Boss,这么想其实也并没有错,毕竟自己在井底,那么,就用数组pre[]来存他们的上一级,例如:pre[10]=6;那么就认为10的上级就是6,6的上级假设是4,4的上级加入是自己,也即是 pre[4]=4;这时为4的怪兽就理解了,原来自己的上级是自己,那自己就是王了,这时就找到了boss,回想刚刚说的,两个怪兽如果想要打架,就需要先问问各自的上级,如果上级再问上级直到问到他们属于同一个boss,这时它们就会微笑说,原来我们属于同一个领导,那么find就是用来找最终两个分队的怪兽最终的领导的

 public static int find(int x){
        if(pre[x]==x)return x;//如果上级领导是自己,就返回自己
        return pre[x]=find(pre[x]);//如果不是,就逐一进行访问上级,直到找到boss,这里相当于最终找到了boss,把boss赋值给pre[x]
    }

join的实现

join是用来干嘛的呢?它是用来合并的,加入有两个大王,它们各自占山为王,势力不相上下,实力也不相上下,有一天发生变故,大王1就想和大王2进行合并,大王二琢磨着合并后谁当大王?不能让它当了大王,大王2于是就说合并后我来当大王,大王一显然会不同意,大王二说你来找我合并的,不同意也要同意,于是大王二当成了 大王,这时大王二掌握了所有的军队,包括大王一的,那么join就是用来选两个大王其中一个作为总大王的。

 public static void join(int x,int y){
        int xx=find(x);//用find找到第一个大王
        int yy=find(y);//找到第二个大王
        if(xx!=yy){//如果不相等
            pre[xx]=yy;//将其中一个大王统领第一个大王所有的军队
        }

整体代码 

import java.util.Scanner;
public class test1 {
    static  int []pre=new int[10000];//注意题目中范围
    public static void main(String[] args) {
        int n,m,p,x,y;
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();//n个人
        m=sc.nextInt();//m对关系
        p=sc.nextInt();//p询问关系
        for(int i = 0; i < n; i++){
            pre[i]=i;//初始化,自己的祖先是自己
        }
        for(int i = 0; i < m; i++){
            x=sc.nextInt();
            y= sc.nextInt();
            join(x,y);//合并
        }

        for(int i = 0; i <p;i++){
            x=sc.nextInt();
            y= sc.nextInt();
            if(find(x)==find(y)){
                System.out.print("Yes");
            }else{
                System.out.print("No");
            }
        }
    }
    public static int find(int x){
        if(pre[x]==x)return x;
        return pre[x]=find(pre[x]);
    }
    public static void join(int x,int y){
        int xx=find(x);
        int yy=find(y);
        if(xx!=yy){
            pre[xx]=yy;
        }
    }
} 

到此这篇关于Java实现并查集示例详解的文章就介绍到这了,更多相关Java 并查集内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot开发中的数据源详解

    SpringBoot开发中的数据源详解

    这篇文章主要介绍了SpringBoot开发中的数据源详解,数据源(Data Source)顾名思义,数据的来源,是提供某种所需要数据的器件或原始媒体,在数据源中存储了所有建立数据库连接的信息,需要的朋友可以参考下
    2023-09-09
  • mybatis-plus实体类中出现非数据库映射字段解决办法

    mybatis-plus实体类中出现非数据库映射字段解决办法

    这篇文章主要介绍了mybatis-plus实体类中出现非数据库映射字段解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • spring和quartz整合,并简单调用(实例讲解)

    spring和quartz整合,并简单调用(实例讲解)

    下面小编就为大家带来一篇spring和quartz整合,并简单调用(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 详解Spring Boot实战之Restful API的构建

    详解Spring Boot实战之Restful API的构建

    这篇文章主要介绍了详解Spring Boot实战之Restful API的构建,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 详解springmvc如何处理接受http请求

    详解springmvc如何处理接受http请求

    这篇文章主要给大家介绍了springmvc如何处理接受http请求,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • 详解如何判断Java线程池任务已执行完

    详解如何判断Java线程池任务已执行完

    线程池的使用并不复杂,麻烦的是如何判断线程池中的任务已经全部执行完了,所以接下来,我们就来看看如何判断线程中的任务是否已经全部执行完吧
    2023-08-08
  • 详解java模板和回调机制

    详解java模板和回调机制

    这篇文章主要为大家详细介绍了java模板和回调机制,学习java模板,感兴趣的朋友可以参考一下
    2016-03-03
  • SpringMVC+Mybatis二维码实现多平台付款(附源码)

    SpringMVC+Mybatis二维码实现多平台付款(附源码)

    本文主要实现微信支付宝等支付平台合多为一的二维码支付,并且实现有效时间内支付有效,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Spring Cache使用RedisCache案例解析

    Spring Cache使用RedisCache案例解析

    这篇文章主要介绍了Spring Cache使用RedisCache案例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java 中RSA的方式实现非对称加密的实例

    java 中RSA的方式实现非对称加密的实例

    这篇文章主要介绍了java 中RSA的方式实现非对称加密的实例的相关资料,这里提供实例帮助大家理解这部分知识,需要的朋友可以参考下
    2017-08-08

最新评论