# HG changeset patch # User Balazs Dezso # Date 1229814908 -3600 # Node ID bb022b8f9c8f044ac055682cfc42675ba2c52ce7 # Parent d5cfcff85dfd6f6415dfe924e7ffbb1f423cc833# Parent 561be42c4b9935bf3e30a922b8945b2397286a8f Merge bugix #197 diff -r d5cfcff85dfd -r bb022b8f9c8f lemon/unionfind.h --- a/lemon/unionfind.h Fri Dec 12 21:52:53 2008 +0000 +++ b/lemon/unionfind.h Sun Dec 21 00:15:08 2008 +0100 @@ -1177,9 +1177,9 @@ int pd = nodes[jd].parent; if (nodes[nodes[jd].next].size < cmax) { pushLeft(nodes[jd].next, nodes[jd].left); - if (less(nodes[jd].left, nodes[jd].next)) { - nodes[nodes[jd].next].prio = nodes[nodes[jd].left].prio; - nodes[nodes[jd].next].item = nodes[nodes[jd].left].item; + if (nodes[jd].item == nodes[pd].item) { + nodes[nodes[jd].next].prio = nodes[jd].prio; + nodes[nodes[jd].next].item = nodes[jd].item; } popLeft(pd); deleteNode(jd); @@ -1188,9 +1188,10 @@ int ld = nodes[nodes[jd].next].left; popLeft(nodes[jd].next); pushRight(jd, ld); - if (less(ld, nodes[jd].left)) { + if (less(ld, nodes[jd].left) || + nodes[ld].item == nodes[pd].item) { nodes[jd].item = nodes[ld].item; - nodes[jd].prio = nodes[jd].prio; + nodes[jd].prio = nodes[ld].prio; } if (nodes[nodes[jd].next].item == nodes[ld].item) { setPrio(nodes[jd].next); @@ -1219,9 +1220,9 @@ int pd = nodes[jd].parent; if (nodes[nodes[jd].prev].size < cmax) { pushRight(nodes[jd].prev, nodes[jd].right); - if (less(nodes[jd].right, nodes[jd].prev)) { - nodes[nodes[jd].prev].prio = nodes[nodes[jd].right].prio; - nodes[nodes[jd].prev].item = nodes[nodes[jd].right].item; + if (nodes[jd].item == nodes[pd].item) { + nodes[nodes[jd].prev].prio = nodes[jd].prio; + nodes[nodes[jd].prev].item = nodes[jd].item; } popRight(pd); deleteNode(jd); @@ -1230,9 +1231,10 @@ int ld = nodes[nodes[jd].prev].right; popRight(nodes[jd].prev); pushLeft(jd, ld); - if (less(ld, nodes[jd].right)) { + if (less(ld, nodes[jd].right) || + nodes[ld].item == nodes[pd].item) { nodes[jd].item = nodes[ld].item; - nodes[jd].prio = nodes[jd].prio; + nodes[jd].prio = nodes[ld].prio; } if (nodes[nodes[jd].prev].item == nodes[ld].item) { setPrio(nodes[jd].prev); @@ -1400,7 +1402,14 @@ } push(new_id, right_id); pushRight(new_id, ~(classes[r].parent)); - setPrio(new_id); + + if (less(~classes[r].parent, right_id)) { + nodes[new_id].item = nodes[~classes[r].parent].item; + nodes[new_id].prio = nodes[~classes[r].parent].prio; + } else { + nodes[new_id].item = nodes[right_id].item; + nodes[new_id].prio = nodes[right_id].prio; + } id = nodes[id].parent; classes[r].parent = ~new_id; @@ -1440,7 +1449,14 @@ } push(new_id, left_id); pushLeft(new_id, ~(classes[l].parent)); - setPrio(new_id); + + if (less(~classes[l].parent, left_id)) { + nodes[new_id].item = nodes[~classes[l].parent].item; + nodes[new_id].prio = nodes[~classes[l].parent].prio; + } else { + nodes[new_id].item = nodes[left_id].item; + nodes[new_id].prio = nodes[left_id].prio; + } id = nodes[id].parent; classes[l].parent = ~new_id;