Java实现并查集示例详解

作者:水公子 时间:2023-07-17 05:41:34 

题目

题目背景

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

Java实现并查集示例详解

思路

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

find实现

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

Java实现并查集示例详解


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;
       }
   }
}

来源:https://blog.csdn.net/weixin_52924633/article/details/121829960

标签:Java,并查集
0
投稿

猜你喜欢

  • JAVA格式化时间日期的简单实例

    2022-10-06 09:14:58
  • C#多线程处理多个队列数据的方法

    2021-12-26 19:31:02
  • Java开发Oracle数据库连接JDBC Thin Driver 的三种方法

    2022-05-08 09:40:50
  • Spring Cloud微服务架构Sentinel数据双向同步

    2021-07-16 04:17:04
  • C# 枚举Color并展示各种颜色效果的示例

    2023-10-24 21:27:27
  • 基于WPF实现步骤控件的示例代码

    2021-09-12 15:16:16
  • IntelliJ IDEA 2022.2 正式发布新功能体验

    2021-08-14 02:47:33
  • Spring3 整合MyBatis3 配置多数据源动态选择SqlSessionFactory详细教程

    2023-03-21 21:22:27
  • 浅谈Java中Spring Boot的优势

    2022-12-25 17:36:52
  • 浅谈Java多线程编程中Boolean常量的同步问题

    2021-06-20 16:36:26
  • Java操作redis设置第二天凌晨过期的解决方案

    2022-11-15 11:40:10
  • Java Spring的refresh方法你知道吗

    2023-07-08 11:53:18
  • Windows系统中Java调用cmd命令及执行exe程序的方法

    2021-11-27 23:00:02
  • C#控制台程序如何发布到服务器Linux上运行

    2022-07-17 05:57:52
  • C#泛型的使用及示例详解

    2022-03-14 07:01:59
  • Java使用组件编写窗口实现网络图片显示

    2023-04-14 18:06:04
  • Springboot如何根据实体类生成数据库表

    2023-11-20 13:54:39
  • Android开发之HttpClient异步请求数据的方法详解【附demo源码下载】

    2023-01-09 11:08:31
  • Mybatis中的resultType和resultMap查询操作实例详解

    2022-02-24 17:05:42
  • c# 组合模式

    2022-07-07 09:04:09
  • asp之家 软件编程 m.aspxhome.com