vadimk772336

то же самое но без саут

Nov 1st, 2021
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <deque>
  4.  
  5. using namespace std;
  6.  
  7. enum heap_type
  8. {
  9. heap_max = 0,
  10. heap_min = 1
  11. };
  12.  
  13. class Heap
  14. {
  15. std::vector<int> h;
  16. std::vector<int> ID_to_HeapIdx;
  17. int heap_size;
  18. int curr_ID;
  19.  
  20. public:
  21. Heap();
  22. void siftup(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID);
  23. void siftdown(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID);
  24. void add(int sort_type, int vertex, int ID, std::vector<int>& HeapIdx_to_ID);
  25. void delete_vertex(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID);
  26. bool isempty();
  27. void out();
  28. int get_root();
  29. };
  30.  
  31. Heap::Heap()
  32. {
  33. std::vector<int> h;
  34. heap_size = 0;
  35. std::vector<int> ID_to_HeapIdx;
  36. }
  37.  
  38. int Heap::get_root()
  39. {
  40. if (heap_size > 0)
  41. return h[0];
  42. return -1;
  43. }
  44.  
  45. bool Heap::isempty()
  46. {
  47. if (heap_size == 0)
  48. return true;
  49. return false;
  50. }
  51.  
  52. void Heap::siftup(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID)
  53. {
  54. int curr, parent, tmp;
  55. curr = heap_size - 1;
  56. parent = (curr - 1);
  57. for (int i = 0; i < HeapIdx_to_ID.size(); i++)
  58. for (int i = 0; i < ID_to_HeapIdx.size(); i++)
  59. while (parent >= 0 && curr > 0)
  60. {
  61.  
  62. if (sort_type == heap_max & h[parent] < h[curr])
  63. {
  64.  
  65. int buff = h[curr];
  66. h[curr] = h[parent];
  67. h[parent] = buff;
  68.  
  69. tmp = HeapIdx_to_ID[parent];
  70. HeapIdx_to_ID[parent] = HeapIdx_to_ID[curr];
  71. HeapIdx_to_ID[curr] = tmp;
  72.  
  73.  
  74. tmp = ID_to_HeapIdx[HeapIdx_to_ID[parent]];
  75. ID_to_HeapIdx[HeapIdx_to_ID[parent]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  76. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  77. }
  78.  
  79. if (sort_type == heap_min & h[parent] > h[curr])
  80. {
  81.  
  82. int buff = h[curr];
  83. h[curr] = h[parent];
  84. h[parent] = buff;
  85.  
  86. tmp = HeapIdx_to_ID[parent];
  87. HeapIdx_to_ID[parent] = HeapIdx_to_ID[curr];
  88. HeapIdx_to_ID[curr] = tmp;
  89.  
  90.  
  91. tmp = ID_to_HeapIdx[HeapIdx_to_ID[parent]];
  92. ID_to_HeapIdx[HeapIdx_to_ID[parent]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  93. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  94. }
  95. curr = parent;
  96. parent = (curr - 1);
  97. }
  98. }
  99.  
  100. void Heap::add(int sort_type, int vertex, int ID, std::vector<int>& HeapIdx_to_ID)
  101. {
  102.  
  103. h.push_back(vertex);
  104. ID_to_HeapIdx.push_back(heap_size);
  105. HeapIdx_to_ID.push_back(ID);
  106. heap_size++;
  107. siftup(sort_type, ID, HeapIdx_to_ID);
  108. }
  109.  
  110. void Heap::siftdown(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID)
  111. {
  112. int parent, max_child, min_child, tmp, buff;
  113.  
  114. int curr = ID_to_HeapIdx[ID];
  115. ID_to_HeapIdx[ID] = -100;
  116. int child_l = 2 * curr + 1;
  117. int child_r = 2 * curr + 2;
  118.  
  119.  
  120. if (h[child_r] < h[child_l])
  121. {
  122. max_child = child_l;
  123. min_child = child_r;
  124. }
  125. else
  126. {
  127. max_child = child_r;
  128. min_child = child_l;
  129. }
  130. while (child_l < heap_size)
  131. {
  132.  
  133.  
  134. if (sort_type == heap_max)
  135. {
  136. if (child_l == heap_size - 1)
  137. max_child = child_l;
  138.  
  139. else if (h[child_r] < h[child_l])
  140. max_child = child_l;
  141. else
  142. max_child = child_r;
  143. }
  144.  
  145. if (sort_type == heap_min)
  146. {
  147. if (child_l == heap_size - 1)
  148. min_child = child_l;
  149. else if (h[child_r] < h[child_l])
  150. min_child = child_r;
  151. else
  152. min_child = child_l;
  153. }
  154.  
  155. if (sort_type == heap_max & h[curr] < h[max_child])
  156. {
  157.  
  158. buff = h[curr];
  159. h[curr] = h[max_child];
  160. h[max_child] = buff;
  161.  
  162. tmp = HeapIdx_to_ID[max_child];
  163. HeapIdx_to_ID[max_child] = HeapIdx_to_ID[curr];
  164. HeapIdx_to_ID[curr] = tmp;
  165.  
  166. tmp = ID_to_HeapIdx[HeapIdx_to_ID[max_child]];
  167. ID_to_HeapIdx[HeapIdx_to_ID[max_child]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  168. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  169. }
  170.  
  171. if (sort_type == heap_min & h[curr] > h[max_child])
  172. {
  173.  
  174. buff = h[curr];
  175. h[curr] = h[max_child];
  176. h[max_child] = buff;
  177.  
  178. tmp = HeapIdx_to_ID[max_child];
  179. HeapIdx_to_ID[max_child] = HeapIdx_to_ID[curr];
  180. HeapIdx_to_ID[curr] = tmp;
  181.  
  182. tmp = ID_to_HeapIdx[HeapIdx_to_ID[max_child]];
  183. ID_to_HeapIdx[HeapIdx_to_ID[max_child]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  184. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  185. }
  186. curr = max_child;
  187. child_l = 2 * curr + 1;
  188. child_r = 2 * curr + 2;
  189. }
  190. }
  191.  
  192.  
  193. void Heap::delete_vertex(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID)
  194. {
  195. int pos = ID_to_HeapIdx[ID];
  196. h[pos] = h[heap_size - 1];
  197. h.pop_back();
  198. heap_size--;
  199. int id_last_el = HeapIdx_to_ID[heap_size];
  200. HeapIdx_to_ID[pos] = id_last_el;
  201. HeapIdx_to_ID[heap_size] = -100;
  202. ID_to_HeapIdx[id_last_el] = pos; //Дают айди послед эл, а он уже на Pos
  203. siftdown(sort_type, ID, HeapIdx_to_ID);
  204. }
  205.  
  206. void Heap::out(void)
  207. {
  208.  
  209. for (int i = 0; i < heap_size; i++)
  210. {
  211. cout << h[i] << " ";
  212. }
  213. cout << endl;
  214. }
Advertisement
Add Comment
Please, Sign In to add comment