Guest User

Untitled

a guest
Apr 22nd, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <list>
  4. using namespace std;
  5.  
  6. int ilog2(int x) {
  7.     int n = 0;
  8.     while (x > 0) {
  9.         x >>= 1;
  10.         n++;
  11.     }
  12.     return n;
  13. }
  14.  
  15. class fib_heap_node {
  16. public:
  17.     fib_heap_node *p, *left, *right, *child;
  18.     int key, degree;
  19.     bool mark;
  20.  
  21.     fib_heap_node(int x) {
  22.         key = x;
  23.         degree = 0;
  24.         p = child = NULL;
  25.         left = right = this;
  26.         mark = false;
  27.     }
  28. };
  29.  
  30. class fib_heap {
  31.  
  32.     fib_heap_node *min;
  33.     int size;
  34.  
  35.     void add_to_list(fib_heap_node *elem,
  36.                      fib_heap_node *newelem) {
  37.         if (elem == NULL)
  38.             return;
  39.         fib_heap_node* er = elem->right;
  40.         newelem->right = er;
  41.         er->left = newelem;
  42.         elem->right = newelem;
  43.         newelem->left = elem;
  44.     }
  45.  
  46.     void remove_from_list(fib_heap_node *rmelem) {
  47.         fib_heap_node *er = rmelem->right,
  48.                       *el = rmelem->left;
  49.         el->right = er;
  50.         er->left = el;
  51.     }
  52.  
  53. public:
  54.     fib_heap() {
  55.         size = 0;
  56.         min = NULL;
  57.     }
  58.  
  59.     int top() {
  60.         return min->key;
  61.     }
  62.  
  63.     void push(int x) {
  64.         fib_heap_node *nx = new fib_heap_node(x);
  65.         add_to_list(min, nx);
  66.         if (min == NULL || min->key > x)
  67.             min = nx;
  68.         size++;
  69.     }
  70.  
  71.     int pop() {
  72.         fib_heap_node *z = min;
  73.         int res = z->key;
  74.         if (min != NULL) {
  75.             fib_heap_node *mchild = z->child;
  76.             if (mchild != NULL) {
  77.                 fib_heap_node *last = mchild->left;
  78.                 while (true) {
  79.                     fib_heap_node *next = mchild->right;
  80.                     add_to_list(min, mchild);
  81.                     mchild->p = NULL;
  82.                     if (mchild == last)
  83.                         break;
  84.                     mchild = next;
  85.                 }
  86.             }
  87.             remove_from_list(z);
  88.             if (z == z->right)
  89.                 min = NULL;
  90.             else {
  91.                 min = z->right;
  92.                 consolidate();
  93.             }
  94.             delete z;
  95.             size--;
  96.         }
  97.         return res;
  98.     }
  99.  
  100.     void consolidate() {
  101.         int dn = ilog2(size);
  102.         fib_heap_node *a[dn];
  103.         for (int i = 0; i < dn; i++)
  104.             a[i] = NULL;
  105.         fib_heap_node *mroot = min,
  106.                       *last = mroot->left;
  107.         while (true) {
  108.             fib_heap_node *x = mroot,
  109.                           *next = mroot->right;
  110.             int d = x->degree;
  111.             while (a[d] != NULL) {
  112.                 fib_heap_node *y = a[d];
  113.                 if (x->key > y->key)
  114.                         swap(x, y);
  115.                 link(y, x);
  116.                 a[d] = NULL;
  117.                 d++;
  118.             }
  119.             a[d] = x;
  120.             if (mroot == last)
  121.                 break;
  122.             mroot = next;
  123.         }
  124.         min = NULL;
  125.         for (int i = 0; i < dn; i++) {
  126.             if (a[i] != NULL) {
  127.                 a[i]->left = a[i];
  128.                 a[i]->right = a[i];
  129.                 add_to_list(min, a[i]);
  130.                 if (min == NULL || a[i]->key < min->key)
  131.                     min = a[i];
  132.             }
  133.         }
  134.     }
  135.  
  136.     void link(fib_heap_node *y,
  137.               fib_heap_node *x) {
  138.         remove_from_list(y);
  139.         y->left = y->right = y;
  140.         if (x->child != NULL)
  141.             add_to_list(x->child, y);
  142.         else {
  143.             y->p = x;
  144.             x->child = y;
  145.         }
  146.         x->degree++;
  147.         y->mark = false;
  148.     }
  149. };
  150.  
  151. int main() {
  152.     fib_heap h;
  153.     srand(time(0));
  154.     int n = 1000000;
  155.     for (int i = 0; i < n; i++) {
  156.         int m = rand() % 1000000000;
  157.         //cout << m << endl;
  158.         h.push(m);
  159.         //if (i % 20 == 0)
  160.             //h.consolidate();
  161.     }
  162.     cout << endl;
  163.     /*
  164.     h.push(43);
  165.     h.push(1);
  166.     h.push(63);
  167.     h.push(95);
  168.     h.push(6);*/
  169.     for (int i = 0; i < n; i++)
  170.         cout << h.pop() << endl;
  171.     cout << "OK";
  172.     return 0;
  173. }
Add Comment
Please, Sign In to add comment