日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手打配对堆模板(支持push, pop, top, join)

發布時間:2025/4/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手打配对堆模板(支持push, pop, top, join) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 常數較二叉堆小。
  • 采用 new、delete 分配內存,不喜勿噴。
  • 支持任意類型(需定義 operator< 或傳入比較器)(需要默認構造函數)

如有錯請指正!謝謝!

template<typename T, typename Comp = less<T>> class pairing_heap {public:typedef Comp comparer;pairing_heap() : _r(nullptr) { }~pairing_heap() { while(!empty()) pop(); }void push(T o){_Node *n = new _Node;n->v = o, n->son = n->sib = nullptr;_r = _merge(_r, n);}T top(){return _r ? _r->v : T();}void pop(){_Node *nr = _multi_merge(_r->son);if(_r) delete _r;_r = nr;}bool empty(){return !_r;}void join(pairing_heap<T, Comp> &p){_r = _merge(_r, p._r);p._r = nullptr;}private:struct _Node{T v;_Node *son, *sib;} *_r;comparer _C;_Node *_merge(_Node *a1, _Node *a2){if(!a1 || !a2) return a1 ? a1 : a2;if(_C(a1->v, a2->v)) swap(a1, a2);_Node *s = a1->son;if(!s) a1->son = a2;else{a2->sib = s->sib;s->sib = a2;}return a1;}_Node *_multi_merge(_Node *a){_Node *b, *c;if(!a) return nullptr;if(!a->sib) return a;b = a->sib, a->sib = nullptr;if(!b->sib) return _merge(a, b);c = b->sib, b->sib = nullptr;return _merge(_merge(a, b), _multi_merge(c));} };

轉載于:https://www.cnblogs.com/js2xxx/p/9437465.html

總結

以上是生活随笔為你收集整理的手打配对堆模板(支持push, pop, top, join)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。