并查集

 1 package my_basic.class_5;
 2 
 3 import java.util.HashMap;
 4 import java.util.List;
 5 
 6 public class UnionFind {
 7     public static class Node{
 8         //任意定义
 9         
10     }
11     //并查集
12     public static class UnionFindSet {
13         private HashMap<Node, Node> fatherMap;
14         private HashMap<Node, Integer> sizeMap;
15         
16         public UnionFindSet(List<Node> list) {
17             fatherMap  = new HashMap<Node, Node>();
18             sizeMap = new HashMap<Node, Integer>();
19             makeSet(list);
20         }
21         public void makeSet(List<Node> list) {
22             fatherMap.clear();
23             sizeMap.clear();
24             for (Node node : list) {
25                 fatherMap.put(node, node);  //所有节点的父亲都是指向自己
26                 sizeMap.put(node, 1);  //所有节点的size都是1
27                 
28             }
29         }
30         
31         //查找代表节点
32         public Node findHead(Node node) {
33             Node father = fatherMap.get(node);
34             if (father != node) {
35                 father = findHead(father);
36             }
37             fatherMap.put(node, father);  //扁平化   对查找代表节点的优化操作 查找路径上的节点的父亲都直接指向代表节点
38             return father;
39         }
40         
41         public boolean isSameSet(Node a,Node b) {
42             return (findHead(a) == findHead(b));
43         }
44         //a所在的集合和b所在的集合 合并
45         public void union(Node a, Node b) {
46             if (a==null || b==null) {
47                 return;
48             }
49             Node headA = findHead(a);
50             Node headB = findHead(b);
51             if (headA != headB) {
52                 int aSetSize = sizeMap.get(headA);
53                 int bSetSize = sizeMap.get(headB);
54                 if (aSetSize < bSetSize) {
55                     //合并到b集合
56                     fatherMap.put(headA, headB);
57                     sizeMap.put(headB, aSetSize+bSetSize);
58                 }else {
59                     fatherMap.put(headB, headA);
60                     sizeMap.put(headA, aSetSize+bSetSize);
61                 }
62             }
63         }
64          
65     }
66     
67     public static void main(String[] args) {
68         
69     }
70     
71 }

 

转载于:https://www.cnblogs.com/lihuazhu/p/10999192.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值