并查集实现以及相关题目

这里写目录标题

并查集

在这里插入图片描述

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;

class Node{
    public int v;
    public Node(int a){
        v =a;

    }

}
class bing{
    public HashMap<Integer,Node> node;
    public HashMap<Node,Node> parent;
    public HashMap<Node,Integer> size;
    public bing(List<Integer> aa){
        node = new HashMap<>();
        parent = new HashMap<>();
        size  = new HashMap<>();
        for(Integer a1:aa){
            node.put(a1,new Node(a1));
            parent.put(node.get(a1),node.get(a1));
            size.put(node.get(a1),1);

        }


    }

    public void hebing(int q1,int q2){
        Node a1 = node.get(q1);
        Node a2 = node.get(q2);
        Node a3 = find(a1);
         Node a4 =  find(a2);
         if (a3==a4){
             return;
         }
         Node big = size.get(a3)>size.get(a4)?a3:a4;
         Node sam  = size.get(a3)<=size.get(a4)?a3:a4;
         xiu(big,sam);



    }
    public int ge(){
        return size.size();

    }


    public Node find(Node a1){
        Stack<Node> ae = new Stack<>();

        Node z = a1;
        while (z!=parent.get(z)){
            ae.push(z);
            z = parent.get(z);

        }
        while (!ae.empty()){
            Node qq =ae.pop();
            parent.put(qq,z);



        }




        return z;



    }
    public void xiu(Node big,Node sam){
        int dd =  size.get(big)+1;

       parent.put(sam,big);
       size.remove(sam);
       int k = size.get(big);



       size.put(big,dd);



    }

}


public class t {
    public static void main(String[] args) {
        List<Integer> aa = new  ArrayList<>();
        int[] arr = {1,2,4,3,5,6};
        for (int q:arr){
            aa.add(q);


        }
        bing w  =new bing(aa);
        w.hebing(1,2);
        w.hebing(4,3);
        w.hebing(1,4);

        int c =w.ge();
        System.out.println(c);

    }

}

相关算法题

给定一个方阵求其中一共有几个独立的集合
在这里插入图片描述
上图就是一个方阵(0,2)的下标是1,(0,3)的下标是1说以0,2,3是属于同一个集合(1,3)的下标是1,又因为3是属于0,2,3这个集合所以要把1也并进去所以0,1,2,3是一个集合;4和其他的数组合都没出现1所以4是单独的一个集合;
所以最终的答案就是2

这道题就可以用并查集来解决

class P{
    private int[] parent;
    private int[] size;
    private int[] help;
    private  int jj ;
    public P(int n){
        parent = new int[n];
        size = new int[n];
        help = new int[n];
        jj = n;
        for(int i=0;i<n;i++){
            parent[i] = i;
            size[i] = 1;

        }


    }
    public int geshu(){
        return jj;
    }

    public void pp(int[][] arr){
        for(int i = 0;i<arr.length;i++){
            for (int k = i+1;k<arr.length;k++){
                if(arr[i][k]>0){
                    hebing(i,k);


                }
            }

        }


    }
    public void hebing(int a1,int a2){
        int q1 = find(a1);
        int q2 = find(a2);
        if(q1 == q2){
            return;
        }
        int a3 = size[q1];
        int a4 = size[q2];
        int big = a3>=a4?q1:q2;
        int sam = a3<a4?q1:q2;
        kk(big,sam);






    }
    public void kk(int big,int sam){
        parent[sam] = big;
        size[big]++;
        jj--;



    }
    public int find(int k){
        int z = k;
        int i = 0;


        while (z!=parent[z]){
            help[i] = z;
            i++;

            z = parent[z];
        }
        for(int k1 = 0;k1<i;k1++){
            parent[help[k1]] = z;

        }


        return z;


    }







}
public class t {
    public static void main(String[] args) {
        int[][] arr = {{1,0,1,1,0},{0,1,0,1,0},{1,0,1,0,0},{1,1,0,1,0},{0,0,0,0,1}};
        P kk= new P(5);
        kk.pp(arr);
        int c =kk.geshu();
        System.out.println(c);



    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值