Guest User

Untitled

a guest
Jun 14th, 2024
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.06 KB | None | 0 0
  1. class DisjointSetUnion {
  2.  
  3.     companion object {
  4.  
  5.         const val EMPTY_SLOT = Int.MIN_VALUE
  6.     }
  7.  
  8.     val elemParent: IntArray
  9.     val rank: IntArray
  10.     var setCount = 0
  11.  
  12.     constructor(initialCapacity: Int) {
  13.         elemParent = IntArray(initialCapacity).apply { fill(EMPTY_SLOT) }
  14.         rank = IntArray(initialCapacity)
  15.     }
  16.  
  17.     constructor(initialSetsCount: Int, initSets: Boolean) {
  18.         elemParent = IntArray(initialSetsCount)
  19.         rank = IntArray(initialSetsCount)
  20.         setCount = initialSetsCount
  21.         for (i in 0 until initialSetsCount) {
  22.             elemParent[i] = i
  23.             rank[i] = 0
  24.         }
  25.     }
  26.  
  27.     inline fun makeSet(newElem: Int) {
  28.         ++setCount
  29.         elemParent[newElem] = newElem
  30.         rank[newElem] = 0
  31.     }
  32.  
  33.     fun find(elem: Int): Int {
  34.         if (elemParent[elem] == EMPTY_SLOT) {
  35.             throw Exception()
  36.         }
  37.  
  38.         var element = elem
  39.         var root = element
  40.         while (root != elemParent[root]) {
  41.             root = elemParent[root]
  42.         }
  43.  
  44.         // Path compression
  45.         while (element != elemParent[element]) {
  46.             val prevElem = element;
  47.             element = elemParent[element]
  48.             elemParent[prevElem] = root
  49.         }
  50.         return root
  51.     }
  52.  
  53.     fun unite(elem1: Int, elem2: Int): Int {
  54.         if (elemParent[elem1] == EMPTY_SLOT || elemParent[elem2] == EMPTY_SLOT) {
  55.             throw Exception()
  56.         }
  57.  
  58.         var maxRankElem = find(elem1)
  59.         var minRankElem = find(elem2)
  60.         if (maxRankElem == minRankElem) {
  61.             return maxRankElem
  62.         }
  63.         if (rank[maxRankElem] < rank[minRankElem]) {
  64.             // Swap
  65.             val tmp = maxRankElem
  66.             maxRankElem = minRankElem
  67.             minRankElem = tmp
  68.         }
  69.  
  70.         // Rank heuristic
  71.         elemParent[minRankElem] = maxRankElem;
  72.         if (rank[maxRankElem] == rank[minRankElem]) {
  73.             ++rank[maxRankElem]
  74.         }
  75.         --setCount
  76.         return maxRankElem // return parent both elements
  77.     }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment