您的位置:首页 > 其它

左偏树 模板

2012-11-04 21:00 204 查看
最近因为写一道贪心的题目,需要用到左偏树,而我早就忘记怎么写了。。。。于是就再去看了一遍。

其实左偏树的思想并不难。其本质是一个堆,然后每次合并入右子树,而保持左子树距离最长,也就是说向看起来小的子树中合并,从而使堆一定程度上平衡。他可以做到在 O(logn) 的时间内合并两个堆,十分酷。

关于其应用其实有很多,比如今年 APIO 的 Dispatching (派遣)等。其实如果希望代码量少一点,可以牺牲一下常数,把堆做左偏树来写也可以。

Code :

node * merge(node * a, node * b)
{
if (! a) return b;
if (! b) return a;
if (b->k < a->k) swap(a, b);
a->r = merge(a->r, b);
if (! a->l || a->r && a->l && a->r->dis > a->l->dis) swap(a->r, a->l);
if (a->r) a->dis = a->r->dis + 1; else a->dis = 0;
return a;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: