COIN-OR::LEMON - Graph Library

Ticket #197: 52c04a2a652c.patch

File 52c04a2a652c.patch, 4.1 KB (added by Balazs Dezso, 13 years ago)

Bug fix

  • lemon/unionfind.h

    # HG changeset patch
    # User Balazs Dezso <deba@inf.elte.hu>
    # Date 1229811926 -3600
    # Node ID 52c04a2a652c1f31b2590dbfec13208d69ecd343
    # Parent  30d22b636e57c46ade8b17a1e78498ca113d529d
    Bug fix in heap unionfind (ticket #197)
    
    The minimum item in the unionfind tree might become inconsistent when
    the split operation merges two subtrees which have equal keys. The
    current changeset fix the problem. It also fix a wrong index.
    
    diff -r 30d22b636e57 -r 52c04a2a652c lemon/unionfind.h
    a b  
    11771177            int pd = nodes[jd].parent;
    11781178            if (nodes[nodes[jd].next].size < cmax) {
    11791179              pushLeft(nodes[jd].next, nodes[jd].left);
    1180               if (less(nodes[jd].left, nodes[jd].next)) {
    1181                 nodes[nodes[jd].next].prio = nodes[nodes[jd].left].prio;
    1182                 nodes[nodes[jd].next].item = nodes[nodes[jd].left].item;
     1180              if (nodes[jd].item == nodes[pd].item) {
     1181                nodes[nodes[jd].next].prio = nodes[jd].prio;
     1182                nodes[nodes[jd].next].item = nodes[jd].item;
    11831183              }
    11841184              popLeft(pd);
    11851185              deleteNode(jd);
     
    11881188              int ld = nodes[nodes[jd].next].left;
    11891189              popLeft(nodes[jd].next);
    11901190              pushRight(jd, ld);
    1191               if (less(ld, nodes[jd].left)) {
     1191              if (less(ld, nodes[jd].left) ||
     1192                  nodes[ld].item == nodes[pd].item) {
    11921193                nodes[jd].item = nodes[ld].item;
    1193                 nodes[jd].prio = nodes[jd].prio;
     1194                nodes[jd].prio = nodes[ld].prio;
    11941195              }
    11951196              if (nodes[nodes[jd].next].item == nodes[ld].item) {
    11961197                setPrio(nodes[jd].next);
     
    12191220            int pd = nodes[jd].parent;
    12201221            if (nodes[nodes[jd].prev].size < cmax) {
    12211222              pushRight(nodes[jd].prev, nodes[jd].right);
    1222               if (less(nodes[jd].right, nodes[jd].prev)) {
    1223                 nodes[nodes[jd].prev].prio = nodes[nodes[jd].right].prio;
    1224                 nodes[nodes[jd].prev].item = nodes[nodes[jd].right].item;
     1223              if (nodes[jd].item == nodes[pd].item) {
     1224                nodes[nodes[jd].prev].prio = nodes[jd].prio;
     1225                nodes[nodes[jd].prev].item = nodes[jd].item;
    12251226              }
    12261227              popRight(pd);
    12271228              deleteNode(jd);
     
    12301231              int ld = nodes[nodes[jd].prev].right;
    12311232              popRight(nodes[jd].prev);
    12321233              pushLeft(jd, ld);
    1233               if (less(ld, nodes[jd].right)) {
     1234              if (less(ld, nodes[jd].right) ||
     1235                  nodes[ld].item == nodes[pd].item) {
    12341236                nodes[jd].item = nodes[ld].item;
    1235                 nodes[jd].prio = nodes[jd].prio;
     1237                nodes[jd].prio = nodes[ld].prio;
    12361238              }
    12371239              if (nodes[nodes[jd].prev].item == nodes[ld].item) {
    12381240                setPrio(nodes[jd].prev);
     
    14001402              }
    14011403              push(new_id, right_id);
    14021404              pushRight(new_id, ~(classes[r].parent));
    1403               setPrio(new_id);
     1405
     1406              if (less(~classes[r].parent, right_id)) {
     1407                nodes[new_id].item = nodes[~classes[r].parent].item;
     1408                nodes[new_id].prio = nodes[~classes[r].parent].prio;
     1409              } else {
     1410                nodes[new_id].item = nodes[right_id].item;
     1411                nodes[new_id].prio = nodes[right_id].prio;
     1412              }
    14041413
    14051414              id = nodes[id].parent;
    14061415              classes[r].parent = ~new_id;
     
    14401449              }
    14411450              push(new_id, left_id);
    14421451              pushLeft(new_id, ~(classes[l].parent));
    1443               setPrio(new_id);
     1452
     1453              if (less(~classes[l].parent, left_id)) {
     1454                nodes[new_id].item = nodes[~classes[l].parent].item;
     1455                nodes[new_id].prio = nodes[~classes[l].parent].prio;
     1456              } else {
     1457                nodes[new_id].item = nodes[left_id].item;
     1458                nodes[new_id].prio = nodes[left_id].prio;
     1459              }
    14441460
    14451461              id = nodes[id].parent;
    14461462              classes[l].parent = ~new_id;