并查集

 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 }

 

posted @ 2019-06-10 17:43  _luckyz  阅读(80)  评论(0编辑  收藏  举报