Advertisement
Guest User

Untitled

a guest
Feb 17th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.91 KB | None | 0 0
  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import java.util.Scanner;
  4.  
  5. public class DisjointSet {
  6.     private Map<Long, Node> map = new HashMap<Long, Node>();
  7.     private Map<Long, Integer> sizes = new HashMap<Long, Integer>();
  8.  
  9.     static class Node {
  10.         int rank;
  11.         long data;
  12.         Node parent;
  13.  
  14.         Node(long data) {
  15.             this(data, null, 0);
  16.         }
  17.  
  18.         Node(long data, Node parent, int rank) {
  19.             this.data = data;
  20.             this.parent = parent;
  21.             this.rank = rank;
  22.  
  23.             if(parent == null) {
  24.                 this.parent = this;
  25.             }
  26.         }
  27.     }
  28.  
  29.     public void makeSet(long data) {
  30.         Node n = new Node(data);
  31.         map.put(data, n);
  32.         sizes.put(data, 1);
  33.     }
  34.  
  35.     public void union(long data1, long data2) {
  36.         Node n1 = map.get(data1);
  37.         Node n2 = map.get(data2);
  38.  
  39.         Node p1 = findSet(n1);
  40.         Node p2 = findSet(n2);
  41.  
  42.         if(p1.data != p2.data) {
  43.             int newSize = sizes.get(p1.data) + sizes.get(p2.data);
  44.  
  45.             if(p1.rank >= p2.rank) {
  46.                 p1.rank = p1.rank == p2.rank ? p1.rank + 1 : p1.rank;
  47.                 p2.parent = p1;
  48.                 sizes.put(p1.data, newSize);
  49.             }
  50.             else {
  51.                 p1.parent = p2;
  52.                 sizes.put(p2.data, newSize);
  53.             }
  54.  
  55.         }
  56.     }
  57.  
  58.     public long findSet(long data) {
  59.         return findSet(map.get(data)).data;
  60.     }
  61.  
  62.     public Node findSet(Node n) {
  63.         Node p = n.parent;
  64.         if(p == n) {
  65.             return p;
  66.         }
  67.         // compression!
  68.         n.parent = findSet(n.parent);
  69.         return n.parent;
  70.     }
  71.    
  72.     public int getSize(long data) {
  73.         Node p = findSet(map.get(data));
  74.         return sizes.get(p.data);
  75.     }
  76.    
  77.     public static void main(String[] args) {
  78.         DisjointSet d = new DisjointSet();
  79.         Scanner s = new Scanner(System.in);
  80.         int n = s.nextInt();
  81.         int q = s.nextInt();
  82.        
  83.         for(int i = 1; i <= n; i++) {
  84.             d.makeSet(i);
  85.         }
  86.        
  87.         for(int i = 0; i < q; i++) {
  88.             char type = s.next().charAt(0);
  89.             switch(type) {
  90.             case 'Q':
  91.                 System.out.println(d.getSize(s.nextLong()));
  92.                 break;
  93.             case 'M':
  94.                 d.union(s.nextLong(), s.nextLong());
  95.             }
  96.         }
  97.     }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement