_mw_matching.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:51k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _mw_matching.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. /* This file has been automatically generated from "max_weight_matching.w"
  12.    by CTANGLE (Version 3.1 [km2c]) */
  13. #include <LEDA/basic.h>
  14. #include <LEDA/list.h>
  15. #include <LEDA/ugraph.h>
  16. typedef num_type GEWICHT_TYP;
  17. typedef num_type DUALER_TYP;
  18. typedef list <edge> KANTENLISTE;
  19. #if !defined(__TEMPLATE_FUNCTIONS__)
  20. LEDA_TYPE_PARAMETER(KANTENLISTE)
  21. #endif
  22. #define GENAUIGKEIT 1e-10
  23. enum MARKENTYP {
  24.   S = -1, UNMARKIERT, T
  25. };
  26. class blossom {
  27.  public:
  28.   list <list_item >ub_zeiger_liste;
  29.   list <edge >kantenliste;
  30.   node basis;
  31.   DUALER_TYP z;
  32.   list <node >knotenliste;
  33.   MARKENTYP typ;
  34.   edge kante;
  35.   edge d3_kante;
  36.   list <edge >adj_s_blossoms;
  37.    blossom() {
  38.     ub_zeiger_liste.clear();
  39.     kantenliste.clear();
  40.     knotenliste.clear();
  41.     adj_s_blossoms.clear();
  42.     basis = nil;
  43.     z = 0;
  44.     typ = UNMARKIERT;
  45.     kante = nil;
  46.     d3_kante = nil;
  47.   }
  48.    blossom(const list <list_item >&zliste, const list <edge >&eliste,
  49.      const list <node >&nliste, const node b) {
  50.     ub_zeiger_liste = zliste;
  51.     kantenliste = eliste;
  52.     knotenliste = nliste;
  53.     adj_s_blossoms.clear();
  54.     basis = b;
  55.     z = 0;
  56.     typ = S;
  57.     kante = nil;
  58.     d3_kante = nil;
  59.   }
  60. };
  61. #if !defined(__TEMPLATE_FUNCTIONS__)
  62. void Print(const blossom&, ostream&) {}
  63. void Read(blossom&, istream&) {}
  64. int compare(const blossom&, const blossom&) 
  65. { error_handler(1,"no compare for blossoms"); 
  66.   return 0; 
  67. }
  68. LEDA_TYPE_PARAMETER(blossom)
  69. #endif
  70. int markiere
  71.  (const ugraph &G,
  72.    const edge_array <GEWICHT_TYP > &gewicht,
  73.    const node_array <DUALER_TYP > &u,
  74.    const edge_array <bool >&gematcht,
  75.    const node_array <list_item >&blossom_zu_knoten,
  76.    const node_array <edge >&gematchte_kante,
  77.    list <blossom > &blossomliste,
  78.    list <node >&ungescannt,
  79.    node_array <KANTENLISTE > &brauchbare_kanten,
  80.    list <edge >&pfad,
  81.    node_array <edge >&d2_kante);
  82. static void rek_erweitere
  83.  (const ugraph &G,
  84.    edge_array <bool >&gematcht,
  85.    list <blossom > &unterblossomliste,
  86.    blossom & bl,
  87.    node j);
  88. void erweitere
  89.  (const ugraph &G,
  90.    const edge_array <GEWICHT_TYP > &gewicht,
  91.    const node_array <list_item >&blossom_zu_knoten,
  92.    const node_array <DUALER_TYP > &u,
  93.    const list <edge >&pfad,
  94.    edge_array <bool >&gematcht,
  95.    list <blossom > &blossomliste,
  96.    list <blossom > &unterblossomliste,
  97.    list <node >&ungescannt,
  98.    node_array <edge >&gematchte_kante,
  99.    node_array <KANTENLISTE > &brauchbare_kanten,
  100.    node_array <edge >&d2_kante);
  101. int aendere_duale_variablen
  102.  (const ugraph &G,
  103.    const edge_array <GEWICHT_TYP > &gewicht,
  104.    const node_array <list_item >&blossom_zu_knoten,
  105.    const node_array <edge >&gematchte_kante,
  106.    list <blossom > &blossomliste,
  107.    node_array <DUALER_TYP > &u,
  108.    list <node >&ungescannt,
  109.    node_array <KANTENLISTE > &brauchbare_kanten,
  110.    const node_array <edge >&d2_kante);
  111. void bilde_blossom
  112.  (const ugraph &G,
  113.    const edge_array <GEWICHT_TYP > &gewicht,
  114.    const node_array <DUALER_TYP > &u,
  115.    const edge_array <bool >&gematcht,
  116.    const list <edge >&pfad,
  117.    list <blossom > &blossomliste,
  118.    list <blossom > &unterblossomliste,
  119.    list <node >&ungescannt,
  120.    node_array <list_item >&blossom_zu_knoten,
  121.    node_array <KANTENLISTE > &brauchbare_kanten,
  122.    node_array <edge >&d2_kante);
  123. void expandiere_blossoms
  124.  (const ugraph &G,
  125.    const edge_array <GEWICHT_TYP > &gewicht,
  126.    const node_array <DUALER_TYP > &u,
  127.    const edge_array <bool >&gematcht,
  128.    list <blossom > &blossomliste,
  129.    list <blossom > &unterblossomliste,
  130.    list <node >&ungescannt,
  131.    node_array <list_item >&blossom_zu_knoten,
  132.    node_array <KANTENLISTE > &brauchbare_kanten,
  133.    node_array <edge >&d2_kante);
  134. void neues_s_blossom
  135.  (const ugraph &G,
  136.    const edge_array <GEWICHT_TYP > &gewicht,
  137.    const node_array <DUALER_TYP > &u,
  138.    list <blossom > &blossomliste,
  139.    const node_array <list_item >&blossom_zu_knoten,
  140.    const edge_array <bool >&gematcht,
  141.    blossom & bl,
  142.    list <node >&ungescannt,
  143.    node_array <KANTENLISTE > &brauchbare_kanten,
  144.    node_array <edge >&d2_kante);
  145. static void aktualisiere_knotenliste
  146.  (list <blossom > &unterblossomliste,
  147.    blossom & bl);
  148. static void matchingtest
  149.  (const ugraph &G,
  150.    const edge_array <bool >&gematcht);
  151. static void bed1test
  152.  (const ugraph &G,
  153.    const edge_array <GEWICHT_TYP > &gewicht,
  154.    const node_array <DUALER_TYP > &u,
  155.    const list <blossom > &blossomliste,
  156.    const list <blossom > &unterblossomliste,
  157.    const node_array <list_item >&blossom_zu_knoten);
  158. static void bed2test
  159.  (const ugraph &G,
  160.    const edge_array <GEWICHT_TYP > &gewicht,
  161.    const list <blossom > &blossomliste,
  162.    const list <blossom > &unterblossomliste,
  163.    const node_array <list_item >&blossom_zu_knoten,
  164.    const edge_array <bool >&gematcht,
  165.    const node_array <DUALER_TYP > &u);
  166. static void bed3test
  167.  (const ugraph &G,
  168.    const node_array <DUALER_TYP > &u,
  169.    const node_array <edge >&gematchte_kante);
  170. static void bed4test
  171.  (const ugraph &G,
  172.    const list <blossom > &blossomliste,
  173.    const list <blossom > &unterblossomliste,
  174.    const node_array <edge >&gematchte_kante,
  175.    const node_array <list_item >&blossom_zu_knoten);
  176. static DUALER_TYP bestimme_z
  177.  (const ugraph &G,
  178.    const list <blossom > &blossomliste,
  179.    const list <blossom > &unterblossomliste,
  180.    const blossom & bl,
  181.    const edge &e);
  182. list <edge >MAX_WEIGHT_MATCHING (const ugraph &G, 
  183.                                  const edge_array <GEWICHT_TYP > &gewicht) 
  184. {
  185.   edge_array <bool >gematcht;
  186.   gematcht.init(G, false);
  187.   list <blossom > blossomliste;
  188.   list <blossom > unterblossomliste;
  189.   node i;
  190.   forall_nodes (i, G) {
  191.     list <list_item >l1;
  192.     list <edge >l2;
  193.     list <node >l3;
  194.     blossomliste.append(blossom(l1, l2, l3, i));
  195.   }
  196.   node_array <list_item >blossom_zu_knoten(G);
  197.   if (!blossomliste.empty()) {
  198.     list_item lit = blossomliste.first();
  199.     while (lit != nil) {
  200.       node i = blossomliste[lit].basis;
  201.       blossom_zu_knoten[i] = lit;
  202.       lit = blossomliste.succ(lit);
  203.     }
  204.   }
  205.   node_array <DUALER_TYP > u(G);
  206.   GEWICHT_TYP w_max = 0;
  207.   edge e;
  208.   forall_edges (e, G) {
  209.     if (gewicht[e] > w_max)
  210.       w_max = gewicht[e];
  211.   }
  212.   u.init(G, num_type(w_max / 2.0));
  213.   node_array <edge >gematchte_kante(G, nil);
  214.   list <edge >l;
  215.   node_array <KANTENLISTE > brauchbare_kanten(G, l);
  216.   list <node >ungescannt;
  217.   node_array <bool >schon_eingefuegt(G, false);
  218.   forall_edges (e, G) {
  219.     if ((gewicht[e] == w_max) ||
  220.       ((gewicht[e] < w_max) && (w_max - gewicht[e] < GENAUIGKEIT)) ||
  221.       ((gewicht[e] > w_max) && (gewicht[e] - w_max < GENAUIGKEIT))) {
  222.       if (schon_eingefuegt[G.source(e)] == false) {
  223. ungescannt.append(G.source(e));
  224. schon_eingefuegt[G.source(e)] = true;
  225.       }
  226.       if (schon_eingefuegt[G.target(e)] == false) {
  227. ungescannt.append(G.target(e));
  228. schon_eingefuegt[G.target(e)] = true;
  229.       }
  230.       brauchbare_kanten[G.source(e)].append(e);
  231.       brauchbare_kanten[G.target(e)].append(e);
  232.     }
  233.   }
  234.   list <edge >pfad;
  235.   node_array <edge >d2_kante(G, nil);
  236.   bool maximal = false;
  237.   while (!maximal) {
  238.     pfad.clear();
  239.     int erg_markiere = markiere
  240.     (G, gewicht, u, gematcht, blossom_zu_knoten, gematchte_kante,
  241.       blossomliste, ungescannt, brauchbare_kanten, pfad, d2_kante);
  242.     if (erg_markiere > 0) {
  243.       erweitere
  244. (G, gewicht, blossom_zu_knoten, u, pfad, gematcht, blossomliste,
  245. unterblossomliste, ungescannt, gematchte_kante, brauchbare_kanten, d2_kante);
  246.     }
  247.     else if (erg_markiere < 0) {
  248.       bilde_blossom
  249. (G, gewicht, u, gematcht, pfad, blossomliste, unterblossomliste, ungescannt,
  250. blossom_zu_knoten, brauchbare_kanten, d2_kante);
  251.     }
  252.     else if (erg_markiere == 0) {
  253.       int erg_aendere = aendere_duale_variablen
  254.       (G, gewicht, blossom_zu_knoten, gematchte_kante,
  255. blossomliste, u, ungescannt, brauchbare_kanten, d2_kante);
  256.       if (erg_aendere > 0)
  257. maximal = true;
  258.       else if (erg_aendere < 0) {
  259. expandiere_blossoms
  260.   (G, gewicht, u, gematcht, blossomliste, unterblossomliste, ungescannt,
  261.   blossom_zu_knoten, brauchbare_kanten, d2_kante);
  262.       }
  263.     }
  264.   }
  265.   matchingtest(G, gematcht);
  266.   bed1test(G, gewicht, u, blossomliste, unterblossomliste, blossom_zu_knoten);
  267.   bed2test(G, gewicht, blossomliste, unterblossomliste, blossom_zu_knoten, gematcht, u);
  268.   bed3test(G, u, gematchte_kante);
  269.   bed4test(G, blossomliste, unterblossomliste, gematchte_kante, blossom_zu_knoten);
  270.   list <edge >matching;
  271.   forall_edges (e, G)
  272.     if (gematcht[e] == true) {
  273.       matching.append(e);
  274.     }
  275.   return matching;
  276. }
  277. int markiere
  278.  (const ugraph &G,
  279.    const edge_array <GEWICHT_TYP > &gewicht,
  280.    const node_array <DUALER_TYP > &u,
  281.    const edge_array <bool >&gematcht,
  282.    const node_array <list_item >&blossom_zu_knoten,
  283.    const node_array <edge >&gematchte_kante,
  284.    list <blossom > &blossomliste,
  285.    list <node >&ungescannt,
  286.    node_array <KANTENLISTE > &brauchbare_kanten,
  287.    list <edge >&pfad,
  288.    node_array <edge >&d2_kante) {
  289.   if (!ungescannt.empty()) {
  290.     list_item lit_ungescannt = ungescannt.first();
  291.     while (lit_ungescannt != nil) {
  292.       node i = ungescannt.pop();
  293.       while (!brauchbare_kanten[i].empty()) {
  294. edge e = brauchbare_kanten[i].pop();
  295. node j = G.opposite(i, e);
  296. if (blossomliste[blossom_zu_knoten[j]].typ == UNMARKIERT) {
  297.   blossomliste[blossom_zu_knoten[j]].typ = T;
  298.   blossomliste[blossom_zu_knoten[j]].kante = e;
  299.   node b = blossomliste[blossom_zu_knoten[j]].basis;
  300.   edge e_gematcht = gematchte_kante[b];
  301.   list_item bllit = blossom_zu_knoten[G.opposite(b, e_gematcht)];
  302.   blossomliste[bllit].typ = S;
  303.   blossomliste[bllit].kante = e_gematcht;
  304.   neues_s_blossom
  305.     (G, gewicht, u, blossomliste, blossom_zu_knoten, gematcht, blossomliste[bllit],
  306.     ungescannt, brauchbare_kanten, d2_kante);
  307. }
  308. else if ((blossomliste[blossom_zu_knoten[j]].typ == S) &&
  309.   (blossom_zu_knoten[i] != blossom_zu_knoten[j])) {
  310.   ungescannt.push(i);
  311.   node start[2];
  312.   start[0] = i;
  313.   start[1] = j;
  314.   list <edge >alt_pfad[2];
  315.   for (int index = 0; index < 2; index++) {
  316.     edge kante = blossomliste[blossom_zu_knoten[start[index]]].kante;
  317.     while (kante != nil) {
  318.       node s = G.source(kante);
  319.       node t = G.target(kante);
  320.       alt_pfad[index].push(kante);
  321.       if (blossom_zu_knoten[s] == blossom_zu_knoten[start[index]]) {
  322. start[index] = t;
  323.       }
  324.       else {
  325. start[index] = s;
  326.       }
  327.       kante = blossomliste[blossom_zu_knoten[start[index]]].kante;
  328.     }
  329.     start[index] = blossomliste[blossom_zu_knoten[start[index]]].basis;
  330.   }
  331.   if (start[0] == start[1]) {
  332.     while (alt_pfad[0].head() == alt_pfad[1].head()) {
  333.       alt_pfad[0].pop();
  334.       alt_pfad[1].pop();
  335.     }
  336.     pfad = alt_pfad[0];
  337.     pfad.append(e);
  338.     if (!alt_pfad[1].empty()) {
  339.       list_item lit = alt_pfad[1].last();
  340.       while (lit != nil) {
  341. pfad.append(alt_pfad[1].inf(lit));
  342. lit = alt_pfad[1].pred(lit);
  343.       }
  344.     }
  345.     return -1;
  346.   }
  347.   else {
  348.     pfad = alt_pfad[0];
  349.     pfad.append(e);
  350.     if (!alt_pfad[1].empty()) {
  351.       list_item lit = alt_pfad[1].last();
  352.       while (lit != nil) {
  353. pfad.append(alt_pfad[1].inf(lit));
  354. lit = alt_pfad[1].pred(lit);
  355.       }
  356.     }
  357.     return 1;
  358.   }
  359. }
  360. else if (blossomliste[blossom_zu_knoten[j]].typ == T) {
  361.   brauchbare_kanten[j].append(e);
  362. }
  363.       }
  364.       lit_ungescannt = ungescannt.first();
  365.     }
  366.   }
  367.  return 0;
  368. }
  369. void neues_s_blossom
  370.  (const ugraph &G,
  371.    const edge_array <GEWICHT_TYP > &gewicht,
  372.    const node_array <DUALER_TYP > &u,
  373.    list <blossom > &blossomliste,
  374.    const node_array <list_item >&blossom_zu_knoten,
  375.    const edge_array <bool >&gematcht,
  376.    blossom & bl,
  377.    list <node >&ungescannt,
  378.    node_array <KANTENLISTE > &brauchbare_kanten,
  379.    node_array <edge >&d2_kante) {
  380.   if (!bl.knotenliste.empty()) {
  381.     list_item knotenlit = bl.knotenliste.first();
  382.     while (knotenlit != nil) {
  383.       node i = bl.knotenliste.inf(knotenlit);
  384.       edge e;
  385.       bool knoten_brauchbar = false;
  386.       brauchbare_kanten[i].clear();
  387.       d2_kante[i] = nil;
  388.       forall_adj_edges (e, i) {
  389. if (gematcht[e] == false) {
  390.   list_item litsource = blossom_zu_knoten[G.source(e)];
  391.   list_item littarget = blossom_zu_knoten[G.target(e)];
  392.   if (litsource != littarget) {
  393.     DUALER_TYP pi = u[G.source(e)] + u[G.target(e)] - gewicht[e];
  394.     if ((pi == 0) ||
  395.       (pi < 0 && (-pi) < GENAUIGKEIT) ||
  396.       (pi > 0 && pi < GENAUIGKEIT)) {
  397.       brauchbare_kanten[i].append(e);
  398.       knoten_brauchbar = true;
  399.     }
  400.     else {
  401.       list_item bllit;
  402.       node j;
  403.       if (G.source(e) == i) {
  404. bllit = littarget;
  405. j = G.target(e);
  406.       }
  407.       else {
  408. bllit = litsource;
  409. j = G.source(e);
  410.       }
  411.       if ((blossomliste[bllit].typ == UNMARKIERT) ||
  412. (blossomliste[bllit].typ == T)) {
  413. if (d2_kante[j] != nil) {
  414.   edge min_e = d2_kante[j];
  415.   DUALER_TYP pi_j;
  416.   pi_j = u[G.source(min_e)] + u[G.target(min_e)] - gewicht[min_e];
  417.   if (pi < pi_j)
  418.     d2_kante[j] = e;
  419. }
  420. else
  421.   d2_kante[j] = e;
  422.       }
  423.       else if (blossomliste[bllit].typ == S) {
  424. if ((pi != 0) ||
  425.   (pi < 0 && (-pi) < GENAUIGKEIT) ||
  426.   (pi > 0 && pi < GENAUIGKEIT)) {
  427.   blossomliste[litsource].adj_s_blossoms.append(e);
  428.   blossomliste[littarget].adj_s_blossoms.append(e);
  429. }
  430. if (bl.d3_kante != nil) {
  431.   edge min_e = bl.d3_kante;
  432.   DUALER_TYP pi_j;
  433.   pi_j = u[G.source(min_e)] + u[G.target(min_e)] - gewicht[min_e];
  434.   if (pi < pi_j)
  435.     bl.d3_kante = e;
  436. }
  437. else
  438.   bl.d3_kante = e;
  439. if (blossomliste[bllit].d3_kante != nil) {
  440.   edge min_e = blossomliste[bllit].d3_kante;
  441.   DUALER_TYP pi_j;
  442.   pi_j = u[G.source(min_e)] + u[G.target(min_e)] - gewicht[min_e];
  443.   if (pi < pi_j)
  444.     blossomliste[bllit].d3_kante = e;
  445. }
  446. else
  447.   blossomliste[bllit].d3_kante = e;
  448.       }
  449.     }
  450.   }
  451. }
  452.       }
  453.       if (knoten_brauchbar == true)
  454. ungescannt.push(i);
  455.       knotenlit = bl.knotenliste.succ(knotenlit);
  456.     }
  457.   }
  458.   else {
  459.     node i = bl.basis;
  460.     edge e;
  461.     bool knoten_brauchbar = false;
  462.     brauchbare_kanten[i].clear();
  463.     d2_kante[i] = nil;
  464.     forall_adj_edges (e, i) {
  465.       if (gematcht[e] == false) {
  466. list_item litsource = blossom_zu_knoten[G.source(e)];
  467. list_item littarget = blossom_zu_knoten[G.target(e)];
  468. if (litsource != littarget) {
  469.   DUALER_TYP pi = u[G.source(e)] + u[G.target(e)] - gewicht[e];
  470.   if ((pi == 0) ||
  471.     (pi < 0 && (-pi) < GENAUIGKEIT) ||
  472.     (pi > 0 && pi < GENAUIGKEIT)) {
  473.     brauchbare_kanten[i].append(e);
  474.     knoten_brauchbar = true;
  475.   }
  476.   else {
  477.     list_item bllit;
  478.     node j;
  479.     if (G.source(e) == i) {
  480.       bllit = littarget;
  481.       j = G.target(e);
  482.     }
  483.     else {
  484.       bllit = litsource;
  485.       j = G.source(e);
  486.     }
  487.     if ((blossomliste[bllit].typ == UNMARKIERT) ||
  488.       (blossomliste[bllit].typ == T)) {
  489.       if (d2_kante[j] != nil) {
  490. edge min_e = d2_kante[j];
  491. DUALER_TYP pi_j;
  492. pi_j = u[G.source(min_e)] + u[G.target(min_e)] - gewicht[min_e];
  493. if (pi < pi_j)
  494.   d2_kante[j] = e;
  495.       }
  496.       else
  497. d2_kante[j] = e;
  498.     }
  499.     else if (blossomliste[bllit].typ == S) {
  500.       if ((pi != 0) ||
  501. (pi < 0 && (-pi) < GENAUIGKEIT) ||
  502. (pi > 0 && pi < GENAUIGKEIT)) {
  503. blossomliste[litsource].adj_s_blossoms.append(e);
  504. blossomliste[littarget].adj_s_blossoms.append(e);
  505.       }
  506.       if (bl.d3_kante != nil) {
  507. edge min_e = bl.d3_kante;
  508. DUALER_TYP pi_j;
  509. pi_j = u[G.source(min_e)] + u[G.target(min_e)] - gewicht[min_e];
  510. if (pi < pi_j)
  511.   bl.d3_kante = e;
  512.       }
  513.       else
  514. bl.d3_kante = e;
  515.       if (blossomliste[bllit].d3_kante != nil) {
  516. edge min_e = blossomliste[bllit].d3_kante;
  517. DUALER_TYP pi_j;
  518. pi_j = u[G.source(min_e)] + u[G.target(min_e)] - gewicht[min_e];
  519. if (pi < pi_j)
  520.   blossomliste[bllit].d3_kante = e;
  521.       }
  522.       else
  523. blossomliste[bllit].d3_kante = e;
  524.     }
  525.   }
  526. }
  527.       }
  528.     }
  529.     if (knoten_brauchbar == true)
  530.       ungescannt.push(i);
  531.   }
  532. }
  533. void erweitere
  534.  (const ugraph &G,
  535.    const edge_array <GEWICHT_TYP > &gewicht,
  536.    const node_array <list_item >&blossom_zu_knoten,
  537.    const node_array <DUALER_TYP > &u,
  538.    const list <edge >&pfad,
  539.    edge_array <bool >&gematcht,
  540.    list <blossom > &blossomliste,
  541.    list <blossom > &unterblossomliste,
  542.    list <node >&ungescannt,
  543.    node_array <edge >&gematchte_kante,
  544.    node_array <KANTENLISTE > &brauchbare_kanten,
  545.    node_array <edge >&d2_kante) {
  546.   if (!pfad.empty()) {
  547.     list_item lit = pfad.first();
  548.     while (lit != nil) {
  549.       edge e = pfad.inf(lit);
  550.       if (gematcht[e] == true) {
  551. gematcht[e] = false;
  552.       }
  553.       else {
  554. gematcht[e] = true;
  555. node s = G.source(e);
  556. node t = G.target(e);
  557. if (s != blossomliste[blossom_zu_knoten[s]].basis) {
  558.   rek_erweitere
  559.     (G, gematcht, unterblossomliste, blossomliste[blossom_zu_knoten[s]], s);
  560.   aktualisiere_knotenliste
  561.     (unterblossomliste, blossomliste[blossom_zu_knoten[s]]);
  562. }
  563. if (t != blossomliste[blossom_zu_knoten[t]].basis) {
  564.   rek_erweitere
  565.     (G, gematcht, unterblossomliste, blossomliste[blossom_zu_knoten[t]], t);
  566.   aktualisiere_knotenliste
  567.     (unterblossomliste, blossomliste[blossom_zu_knoten[t]]);
  568. }
  569.       }
  570.       lit = pfad.succ(lit);
  571.     }
  572.   }
  573.   gematchte_kante.init(G, nil);
  574.   edge e;
  575.   forall_edges (e, G) {
  576.     if (gematcht[e] == true) {
  577.       gematchte_kante[G.source(e)] = e;
  578.       gematchte_kante[G.target(e)] = e;
  579.     }
  580.   }
  581.   list <edge >l;
  582.   brauchbare_kanten.init(G, l);
  583.   ungescannt.clear();
  584.   d2_kante.init(G, nil);
  585.   if (!blossomliste.empty()) {
  586.     list_item bllit = blossomliste.first();
  587.     while (bllit != nil) {
  588.       blossomliste[bllit].typ = UNMARKIERT;
  589.       blossomliste[bllit].d3_kante = nil;
  590.       blossomliste[bllit].kante = nil;
  591.       blossomliste[bllit].adj_s_blossoms.clear();
  592.       bllit = blossomliste.succ(bllit);
  593.     }
  594.   }
  595.   if (!blossomliste.empty()) {
  596.     list_item bllit = blossomliste.first();
  597.     while (bllit != nil) {
  598.       if (gematchte_kante[blossomliste[bllit].basis] == nil) {
  599. blossomliste[bllit].typ = S;
  600. neues_s_blossom
  601.   (G, gewicht, u, blossomliste, blossom_zu_knoten, gematcht,
  602.   blossomliste[bllit], ungescannt, brauchbare_kanten, d2_kante);
  603.       }
  604.       bllit = blossomliste.succ(bllit);
  605.     }
  606.   }
  607. }
  608. static void rek_erweitere
  609.  (const ugraph &G,
  610.    edge_array <bool >&gematcht,
  611.    list <blossom > &unterblossomliste,
  612.    blossom & bl,
  613.    node j) {
  614.   list_item knotenlit = bl.knotenliste.first();
  615.   node i = bl.knotenliste.inf(knotenlit);
  616.   list_item ubzlit = bl.ub_zeiger_liste.first();
  617.   list_item ubllit = bl.ub_zeiger_liste[ubzlit];
  618.   list_item kantenlit = bl.kantenliste.first();
  619.   while (i != j) {
  620.     node b = unterblossomliste[ubllit].basis;
  621.     if (i == b) {
  622.       ubzlit = bl.ub_zeiger_liste.succ(ubzlit);
  623.       ubllit = bl.ub_zeiger_liste[ubzlit];
  624.       kantenlit = bl.kantenliste.succ(kantenlit);
  625.     }
  626.     knotenlit = bl.knotenliste.succ(knotenlit);
  627.     i = bl.knotenliste.inf(knotenlit);
  628.   }
  629.   list <edge >pfad;
  630.   list <list_item >ub_liste;
  631.   list <node >exitknotenliste;
  632.   list_item hklit = kantenlit;
  633.   list_item hzlit = ubzlit;
  634.   if (gematcht[bl.kantenliste.inf(kantenlit)] == true) {
  635.     while (kantenlit != nil) {
  636.       pfad.append(bl.kantenliste.inf(kantenlit));
  637.       kantenlit = bl.kantenliste.pred(kantenlit);
  638.       ub_liste.append(bl.ub_zeiger_liste[ubzlit]);
  639.       ubzlit = bl.ub_zeiger_liste.pred(ubzlit);
  640.     }
  641.     ubzlit = bl.ub_zeiger_liste.last();
  642.     ub_liste.append(bl.ub_zeiger_liste[ubzlit]);
  643.   }
  644.   else {
  645.     kantenlit = bl.kantenliste.succ(kantenlit);
  646.     while (kantenlit != nil) {
  647.       pfad.append(bl.kantenliste.inf(kantenlit));
  648.       kantenlit = bl.kantenliste.succ(kantenlit);
  649.       ub_liste.append(bl.ub_zeiger_liste[ubzlit]);
  650.       ubzlit = bl.ub_zeiger_liste.succ(ubzlit);
  651.     }
  652.     ub_liste.append(bl.ub_zeiger_liste[ubzlit]);
  653.   }
  654.   kantenlit = pfad.first();
  655.   while (kantenlit != nil) {
  656.     edge e = pfad.inf(kantenlit);
  657.     if (gematcht[e] == true) {
  658.       gematcht[e] = false;
  659.     }
  660.     else {
  661.       gematcht[e] = true;
  662.       exitknotenliste.append(G.source(e));
  663.       exitknotenliste.append(G.target(e));
  664.     }
  665.     kantenlit = pfad.succ(kantenlit);
  666.   }
  667.   list <list_item >ubzliste[2];
  668.   ubzlit = hzlit;
  669.   kantenlit = hklit;
  670.   ubzlit = bl.ub_zeiger_liste.succ(ubzlit);
  671.   bl.ub_zeiger_liste.split(ubzlit, ubzliste[0], ubzliste[1]);
  672.   bl.ub_zeiger_liste.conc(ubzliste[1]);
  673.   bl.ub_zeiger_liste.conc(ubzliste[0]);
  674.   list <edge >kaliste[2];
  675.   kantenlit = bl.kantenliste.succ(kantenlit);
  676.   bl.kantenliste.split(kantenlit, kaliste[0], kaliste[1]);
  677.   bl.kantenliste.conc(kaliste[1]);
  678.   bl.kantenliste.conc(kaliste[0]);
  679.   bl.basis = j;
  680.   list_item lit = ub_liste.pop();
  681.   node b = unterblossomliste[lit].basis;
  682.   if (j != b) {
  683.     rek_erweitere
  684.       (G, gematcht, unterblossomliste, unterblossomliste[lit], j);
  685.     aktualisiere_knotenliste
  686.       (unterblossomliste, unterblossomliste[lit]);
  687.   }
  688.   while (!exitknotenliste.empty()) {
  689.     node k = exitknotenliste.pop();
  690.     node l = exitknotenliste.pop();
  691.     list_item lit = ub_liste.pop();
  692.     list_item lit2 = ub_liste.pop();
  693.     if ((!unterblossomliste[lit].knotenliste.empty()) &&
  694.       (!unterblossomliste[lit2].knotenliste.empty())) {
  695.       list_item knotenlit = unterblossomliste[lit].knotenliste.first();
  696.       while (knotenlit != nil) {
  697. node hilfsknoten = unterblossomliste[lit].knotenliste[knotenlit];
  698. if (hilfsknoten == k) {
  699.   if (k != unterblossomliste[lit].basis) {
  700.     rek_erweitere
  701.       (G, gematcht, unterblossomliste, unterblossomliste[lit], k);
  702.     aktualisiere_knotenliste
  703.       (unterblossomliste, unterblossomliste[lit]);
  704.   }
  705.   if (l != unterblossomliste[lit2].basis) {
  706.     rek_erweitere
  707.       (G, gematcht, unterblossomliste, unterblossomliste[lit2], l);
  708.     aktualisiere_knotenliste
  709.       (unterblossomliste, unterblossomliste[lit2]);
  710.   }
  711.   break;
  712. }
  713. else if (hilfsknoten == l) {
  714.   if (l != unterblossomliste[lit].basis) {
  715.     rek_erweitere
  716.       (G, gematcht, unterblossomliste, unterblossomliste[lit], l);
  717.     aktualisiere_knotenliste
  718.       (unterblossomliste, unterblossomliste[lit]);
  719.   }
  720.   if (k != unterblossomliste[lit2].basis) {
  721.     rek_erweitere
  722.       (G, gematcht, unterblossomliste, unterblossomliste[lit2], k);
  723.     aktualisiere_knotenliste
  724.       (unterblossomliste, unterblossomliste[lit2]);
  725.   }
  726.   break;
  727. }
  728. knotenlit = unterblossomliste[lit].knotenliste.succ(knotenlit);
  729.       }
  730.     }
  731.     else if ((unterblossomliste[lit].knotenliste.empty()) &&
  732.       (!unterblossomliste[lit2].knotenliste.empty())) {
  733.       if (k == unterblossomliste[lit].basis) {
  734. if (l != unterblossomliste[lit2].basis) {
  735.   rek_erweitere
  736.     (G, gematcht, unterblossomliste, unterblossomliste[lit2], l);
  737.   aktualisiere_knotenliste
  738.     (unterblossomliste, unterblossomliste[lit2]);
  739. }
  740.       }
  741.       else {
  742. if (k != unterblossomliste[lit2].basis) {
  743.   rek_erweitere
  744.     (G, gematcht, unterblossomliste, unterblossomliste[lit2], k);
  745.   aktualisiere_knotenliste
  746.     (unterblossomliste, unterblossomliste[lit2]);
  747. }
  748.       }
  749.     }
  750.     else if ((!unterblossomliste[lit].knotenliste.empty()) &&
  751.       (unterblossomliste[lit2].knotenliste.empty())) {
  752.       if (k == unterblossomliste[lit2].basis) {
  753. if (l != unterblossomliste[lit].basis) {
  754.   rek_erweitere
  755.     (G, gematcht, unterblossomliste, unterblossomliste[lit], l);
  756.   aktualisiere_knotenliste
  757.     (unterblossomliste, unterblossomliste[lit]);
  758. }
  759.       }
  760.       else {
  761. if (k != unterblossomliste[lit].basis) {
  762.   rek_erweitere
  763.     (G, gematcht, unterblossomliste, unterblossomliste[lit], k);
  764.   aktualisiere_knotenliste
  765.     (unterblossomliste, unterblossomliste[lit]);
  766. }
  767.       }
  768.     }
  769.   }
  770. }
  771. static void aktualisiere_knotenliste
  772.  (list <blossom > &unterblossomliste, blossom & bl) {
  773.   bl.knotenliste.clear();
  774.   if (!bl.ub_zeiger_liste.empty()) {
  775.     list_item ubzlit = bl.ub_zeiger_liste.first();
  776.     while (ubzlit != nil) {
  777.       list_item ubllit = bl.ub_zeiger_liste[ubzlit];
  778.       if (!unterblossomliste[ubllit].knotenliste.empty()) {
  779. list_item knotenlit = unterblossomliste[ubllit].knotenliste.first();
  780. while (knotenlit != nil) {
  781.   node i = unterblossomliste[ubllit].knotenliste.inf(knotenlit);
  782.   bl.knotenliste.append(i);
  783.   knotenlit = unterblossomliste[ubllit].knotenliste.succ(knotenlit);
  784. }
  785.       }
  786.       else {
  787. bl.knotenliste.append(unterblossomliste[ubllit].basis);
  788.       }
  789.       ubzlit = bl.ub_zeiger_liste.succ(ubzlit);
  790.     }
  791.   }
  792. }
  793. void bilde_blossom
  794.  (const ugraph &G,
  795.    const edge_array <GEWICHT_TYP > &gewicht,
  796.    const node_array <DUALER_TYP > &u,
  797.    const edge_array <bool >&gematcht,
  798.    const list <edge >&pfad,
  799.    list <blossom > &blossomliste,
  800.    list <blossom > &unterblossomliste,
  801.    list <node >&ungescannt,
  802.    node_array <list_item >&blossom_zu_knoten,
  803.    node_array <KANTENLISTE > &brauchbare_kanten,
  804.    node_array <edge >&d2_kante) {
  805.   node neue_basis;
  806.   list_item neues_blossom;
  807.   list <list_item >zliste;
  808.   list <node >nliste;
  809.   edge hilfskante;
  810.   edge e1 = pfad.inf(pfad.first());
  811.   edge e2 = pfad.inf(pfad.last());
  812.   node i1 = G.source(e1);
  813.   node i2 = G.target(e1);
  814.   node i3 = G.source(e2);
  815.   node i4 = G.target(e2);
  816.   if ((blossom_zu_knoten[i1] == blossom_zu_knoten[i3]) ||
  817.     (blossom_zu_knoten[i1] == blossom_zu_knoten[i4])) {
  818.     neue_basis = blossomliste[blossom_zu_knoten[i1]].basis;
  819.   }
  820.   else
  821.     neue_basis = blossomliste[blossom_zu_knoten[i2]].basis;
  822.   list_item litpfad = pfad.first();
  823.   while (pfad.succ(litpfad) != nil) {
  824.     list_item bllit;
  825.     edge e1 = pfad.inf(litpfad);
  826.     edge e2 = pfad.inf(pfad.succ(litpfad));
  827.     node i1 = G.source(e1);
  828.     node i2 = G.target(e1);
  829.     node i3 = G.source(e2);
  830.     node i4 = G.target(e2);
  831.     if ((blossom_zu_knoten[i1] == blossom_zu_knoten[i3]) ||
  832.       (blossom_zu_knoten[i1] == blossom_zu_knoten[i4])) {
  833.       bllit = blossom_zu_knoten[i1];
  834.     }
  835.     else
  836.       bllit = blossom_zu_knoten[i2];
  837.     if (!blossomliste[bllit].knotenliste.empty()) {
  838.       list_item knotenlit = blossomliste[bllit].knotenliste.first();
  839.       while (knotenlit != nil) {
  840. node i = blossomliste[bllit].knotenliste[knotenlit];
  841. nliste.append(i);
  842. knotenlit = blossomliste[bllit].knotenliste.succ(knotenlit);
  843.       }
  844.     }
  845.     else {
  846.       node i = blossomliste[bllit].basis;
  847.       nliste.append(i);
  848.     }
  849.     if (blossomliste[bllit].typ == T) {
  850.       neues_s_blossom(G, gewicht, u, blossomliste, blossom_zu_knoten, gematcht,
  851. blossomliste[bllit], ungescannt, brauchbare_kanten, d2_kante);
  852.     }
  853.     blossom bl = blossomliste.del_item(bllit);
  854.     bllit = unterblossomliste.append(bl);
  855.     unterblossomliste[bllit].typ = UNMARKIERT;
  856.     unterblossomliste[bllit].kante = nil;
  857.     zliste.append(bllit);
  858.     litpfad = pfad.succ(litpfad);
  859.   }
  860.   list_item bllit = blossom_zu_knoten[neue_basis];
  861.   blossom bl = blossomliste.del_item(bllit);
  862.   hilfskante = bl.kante;
  863.   bllit = unterblossomliste.append(bl);
  864.   unterblossomliste[bllit].typ = UNMARKIERT;
  865.   unterblossomliste[bllit].kante = nil;
  866.   zliste.append(bllit);
  867.   if (!bl.knotenliste.empty()) {
  868.     list_item lit = bl.knotenliste.first();
  869.     while (lit != nil) {
  870.       nliste.append(bl.knotenliste.inf(lit));
  871.       lit = bl.knotenliste.succ(lit);
  872.     }
  873.   }
  874.   else
  875.     nliste.append(bl.basis);
  876.   bl = blossom(zliste, pfad, nliste, neue_basis);
  877.   bl.typ = S;
  878.   bl.kante = hilfskante;
  879.   neues_blossom = blossomliste.append(bl);
  880.   list_item litn = nliste.first();
  881.   while (litn != nil) {
  882.     node i = nliste[litn];
  883.     blossom_zu_knoten[i] = neues_blossom;
  884.     litn = nliste.succ(litn);
  885.   }
  886.   if (!blossomliste[neues_blossom].ub_zeiger_liste.empty()) {
  887.     list_item ubzlit = blossomliste[neues_blossom].ub_zeiger_liste.first();
  888.     while (ubzlit != nil) {
  889.       list_item ubllit = blossomliste[neues_blossom].ub_zeiger_liste[ubzlit];
  890.       if (unterblossomliste[ubllit].d3_kante != nil) {
  891. edge e = unterblossomliste[ubllit].d3_kante;
  892. node i = G.source(e);
  893. node j = G.target(e);
  894. DUALER_TYP pi = u[G.source(e)] + u[G.target(e)] - gewicht[e];
  895. if ((blossom_zu_knoten[i] == blossom_zu_knoten[j]) ||
  896.   (pi == 0) || (pi < 0 && (-pi) < GENAUIGKEIT) || (pi > 0 && pi < GENAUIGKEIT)) {
  897.   unterblossomliste[ubllit].d3_kante = nil;
  898.   list <list_item >loesche_kante;
  899.   if (!unterblossomliste[ubllit].adj_s_blossoms.empty()) {
  900.     list_item kantenlit = unterblossomliste[ubllit].adj_s_blossoms.first();
  901.     while (kantenlit != nil) {
  902.       edge e = unterblossomliste[ubllit].adj_s_blossoms[kantenlit];
  903.       DUALER_TYP pi = u[G.source(e)] + u[G.target(e)] - gewicht[e];
  904.       if ((blossom_zu_knoten[G.source(e)] != blossom_zu_knoten[G.target(e)]) &&
  905. (pi > GENAUIGKEIT || pi < -GENAUIGKEIT)) {
  906. if (unterblossomliste[ubllit].d3_kante == nil)
  907.   unterblossomliste[ubllit].d3_kante = e;
  908. else {
  909.   edge e_min = unterblossomliste[ubllit].d3_kante;
  910.   DUALER_TYP pi_min = u[G.source(e_min)] + u[G.target(e_min)] - gewicht[e_min];
  911.   if (pi < pi_min)
  912.     unterblossomliste[ubllit].d3_kante = e;
  913. }
  914.       }
  915.       else
  916. loesche_kante.append(kantenlit);
  917.       kantenlit = unterblossomliste[ubllit].adj_s_blossoms.succ(kantenlit);
  918.     }
  919.   }
  920.   while (!loesche_kante.empty()) {
  921.     list_item lit = loesche_kante.pop();
  922.     blossomliste[ubllit].adj_s_blossoms.del_item(lit);
  923.   }
  924. }
  925.       }
  926.       ubzlit = blossomliste[neues_blossom].ub_zeiger_liste.succ(ubzlit);
  927.     }
  928.   }
  929.   if (!blossomliste[neues_blossom].ub_zeiger_liste.empty()) {
  930.     list_item ubzlit = blossomliste[neues_blossom].ub_zeiger_liste.first();
  931.     while (ubzlit != nil) {
  932.       list_item ubllit = blossomliste[neues_blossom].ub_zeiger_liste[ubzlit];
  933.       if (unterblossomliste[ubllit].d3_kante != nil) {
  934. edge e = unterblossomliste[ubllit].d3_kante;
  935. DUALER_TYP pi_e = u[G.source(e)] + u[G.target(e)] - gewicht[e];
  936. if (blossomliste[neues_blossom].d3_kante == nil)
  937.   blossomliste[neues_blossom].d3_kante = e;
  938. else {
  939.   edge e_min = blossomliste[neues_blossom].d3_kante;
  940.   DUALER_TYP pi_min;
  941.   pi_min = u[G.source(e_min)] + u[G.target(e_min)] - gewicht[e_min];
  942.   if (pi_e < pi_min)
  943.     blossomliste[neues_blossom].d3_kante = e;
  944. }
  945. blossomliste[neues_blossom].adj_s_blossoms.append(e);
  946. unterblossomliste[ubllit].d3_kante = nil;
  947.       }
  948.       unterblossomliste[ubllit].adj_s_blossoms.clear();
  949.       ubzlit = blossomliste[neues_blossom].ub_zeiger_liste.succ(ubzlit);
  950.     }
  951.   }
  952. }
  953. int aendere_duale_variablen
  954.  (const ugraph &G, const edge_array <GEWICHT_TYP > &gewicht,
  955.    const node_array <list_item >&blossom_zu_knoten,
  956.    const node_array <edge >&gematchte_kante,
  957.    list <blossom > &blossomliste,
  958.    node_array <DUALER_TYP > &u,
  959.    list <node >&ungescannt,
  960.    node_array <KANTENLISTE > &brauchbare_kanten,
  961.    const node_array <edge >&d2_kante) {
  962.   DUALER_TYP delta, d_1, d_2, d_3, d_4;
  963.   int erg_aendere;
  964.   node_array <bool >schon_eingefuegt;
  965.   schon_eingefuegt.init(G, false);
  966.   d_1 = 0;
  967.   d_2 = 0;
  968.   node i;
  969.   forall_nodes (i, G) {
  970.     if (gematchte_kante[i] == nil) {
  971.       d_1 = u[i];
  972.     }
  973.     list_item bllit = blossom_zu_knoten[i];
  974.     if ((blossomliste[bllit].typ == UNMARKIERT) && (d2_kante[i] != nil)) {
  975.       edge e = d2_kante[i];
  976.       DUALER_TYP pi = u[G.source(e)] + u[G.target(e)] - gewicht[e];
  977.       if ((d_2 == 0) || (pi < d_2)) {
  978. d_2 = pi;
  979.       }
  980.     }
  981.   }
  982.   if (d_2 == 0)
  983.     d_2 = d_1;
  984.   d_3 = d_1;
  985.   d_4 = 2 * d_1;
  986.   if (!blossomliste.empty()) {
  987.     list_item bllit = blossomliste.first();
  988.     while (bllit != nil) {
  989.       if ((blossomliste[bllit].typ == S) && (blossomliste[bllit].d3_kante != nil)) {
  990. edge e = blossomliste[bllit].d3_kante;
  991. DUALER_TYP pi = (u[G.source(e)] + u[G.target(e)] - gewicht[e]) / 2;
  992. if (pi < d_3)
  993.   d_3 = pi;
  994.       }
  995.       else if ((!blossomliste[bllit].knotenliste.empty()) &&
  996. (blossomliste[bllit].typ == T)) {
  997. if (blossomliste[bllit].z < d_4) {
  998.   d_4 = blossomliste[bllit].z;
  999. }
  1000.       }
  1001.       bllit = blossomliste.succ(bllit);
  1002.     }
  1003.   }
  1004.   d_4 = d_4 / 2;
  1005.   if ((d_1 <= d_2) && (d_1 <= d_3) && (d_1 <= d_4)) {
  1006.     delta = d_1;
  1007.     erg_aendere = 1;
  1008.   }
  1009.   else if ((d_2 <= d_3) && (d_2 <= d_4)) {
  1010.     delta = d_2;
  1011.     erg_aendere = 0;
  1012.   }
  1013.   else if (d_3 <= d_4) {
  1014.     delta = d_3;
  1015.     erg_aendere = 0;
  1016.   }
  1017.   else {
  1018.     delta = d_4;
  1019.     erg_aendere = -1;
  1020.   }
  1021.   forall_nodes (i, G) {
  1022.     if (blossomliste[blossom_zu_knoten[i]].typ == S) {
  1023.       u[i] = u[i] - delta;
  1024.     }
  1025.     if (blossomliste[blossom_zu_knoten[i]].typ == T) {
  1026.       u[i] = u[i] + delta;
  1027.     }
  1028.   }
  1029.   if (!blossomliste.empty()) {
  1030.     list_item bllit = blossomliste.first();
  1031.     while (bllit != nil) {
  1032.       if (!blossomliste[bllit].knotenliste.empty()) {
  1033. if (blossomliste[bllit].typ == S) {
  1034.   blossomliste[bllit].z = blossomliste[bllit].z + 2 * delta;
  1035. }
  1036. else if (blossomliste[bllit].typ == T) {
  1037.   blossomliste[bllit].z = blossomliste[bllit].z - 2 * delta;
  1038. }
  1039.       }
  1040.       bllit = blossomliste.succ(bllit);
  1041.     }
  1042.   }
  1043.   if (delta == d_1)
  1044.     return erg_aendere;
  1045.   forall_nodes (i, G) {
  1046.     if ((blossomliste[blossom_zu_knoten[i]].typ == UNMARKIERT) &&
  1047.       (d2_kante[i] != nil)) {
  1048.       edge e = d2_kante[i];
  1049.       node j;
  1050.       if (i == G.target(e))
  1051. j = G.source(e);
  1052.       else
  1053. j = G.target(e);
  1054.       DUALER_TYP pi = u[i] + u[j] - gewicht[e];
  1055.       if ((pi == 0) ||
  1056. ((pi < 0) && ((-pi) < GENAUIGKEIT)) ||
  1057. ((pi > 0) && (pi < GENAUIGKEIT))) {
  1058. brauchbare_kanten[j].append(e);
  1059. if (schon_eingefuegt[j] == false) {
  1060.   ungescannt.push(j);
  1061.   schon_eingefuegt[j] = true;
  1062. }
  1063.       }
  1064.     }
  1065.   }
  1066.   if (!blossomliste.empty()) {
  1067.     edge_array <bool >kante_schon_betrachtet(G, false);
  1068.     list_item bllit = blossomliste.first();
  1069.     while (bllit != nil) {
  1070.       if ((blossomliste[bllit].typ == S) && (blossomliste[bllit].d3_kante != nil)) {
  1071. edge e = blossomliste[bllit].d3_kante;
  1072. DUALER_TYP pi = u[G.source(e)] + u[G.target(e)] - gewicht[e];
  1073. if ((pi == 0) ||
  1074.   ((pi < 0) && ((-pi) < GENAUIGKEIT)) ||
  1075.   ((pi > 0) && (pi < GENAUIGKEIT))) {
  1076.   if (schon_eingefuegt[G.source(e)] == false) {
  1077.     ungescannt.push(G.source(e));
  1078.     schon_eingefuegt[G.source(e)] = true;
  1079.   }
  1080.   if (schon_eingefuegt[G.target(e)] == false) {
  1081.     ungescannt.push(G.target(e));
  1082.     schon_eingefuegt[G.target(e)] = true;
  1083.   }
  1084.   if (kante_schon_betrachtet[e] == false) {
  1085.     brauchbare_kanten[G.source(e)].append(e);
  1086.     brauchbare_kanten[G.target(e)].append(e);
  1087.     kante_schon_betrachtet[e] = true;
  1088.   }
  1089. }
  1090.       }
  1091.       bllit = blossomliste.succ(bllit);
  1092.     }
  1093.   }
  1094.   return erg_aendere;
  1095. }
  1096. void expandiere_blossoms(
  1097.    const ugraph &G,
  1098.    const edge_array <GEWICHT_TYP > &gewicht,
  1099.    const node_array <DUALER_TYP > &u,
  1100.    const edge_array <bool >&gematcht,
  1101.    list <blossom > &blossomliste,
  1102.    list <blossom > &unterblossomliste,
  1103.    list <node >&ungescannt,
  1104.    node_array <list_item >&blossom_zu_knoten,
  1105.    node_array <KANTENLISTE > &brauchbare_kanten,
  1106.    node_array <edge >&d2_kante)
  1107. {
  1108.   list <list_item >entferne_liste, verschiebe_liste;
  1109.   list_item bllit = blossomliste.first();
  1110.   while (bllit != nil) {
  1111.     if ((!blossomliste[bllit].knotenliste.empty()) &&
  1112.       (blossomliste[bllit].typ == T) && (blossomliste[bllit].z == 0)) {
  1113.       edge e = blossomliste[bllit].kante;
  1114.       node i;
  1115.       if (blossom_zu_knoten[G.source(e)] == bllit)
  1116. i = G.source(e);
  1117.       else if (blossom_zu_knoten[G.target(e)] == bllit)
  1118. i = G.target(e);
  1119.       list_item knotenlit = blossomliste[bllit].knotenliste.first();
  1120.       node j = blossomliste[bllit].knotenliste.inf(knotenlit);
  1121.       list_item ubzlit = blossomliste[bllit].ub_zeiger_liste.first();
  1122.       list_item ubllit = blossomliste[bllit].ub_zeiger_liste.inf(ubzlit);
  1123.       list_item kantenlit = blossomliste[bllit].kantenliste.first();
  1124.       while (i != j) {
  1125. if (j == unterblossomliste[ubllit].basis) {
  1126.   ubzlit = blossomliste[bllit].ub_zeiger_liste.succ(ubzlit);
  1127.   ubllit = blossomliste[bllit].ub_zeiger_liste.inf(ubzlit);
  1128.   kantenlit = blossomliste[bllit].kantenliste.succ(kantenlit);
  1129. }
  1130. knotenlit = blossomliste[bllit].knotenliste.succ(knotenlit);
  1131. j = blossomliste[bllit].knotenliste.inf(knotenlit);
  1132.       }
  1133.       unterblossomliste[ubllit].typ = T;
  1134.       unterblossomliste[ubllit].kante = e;
  1135.       e = blossomliste[bllit].kantenliste.inf(kantenlit);
  1136.       if (gematcht[e] == true) {
  1137. list_item ubzlit_kopie = ubzlit;
  1138. list_item kantenlit_kopie = kantenlit;
  1139. ubzlit = blossomliste[bllit].ub_zeiger_liste.pred(ubzlit);
  1140. while (ubzlit != nil) {
  1141.   e = blossomliste[bllit].kantenliste.inf(kantenlit);
  1142.   ubllit = blossomliste[bllit].ub_zeiger_liste.inf(ubzlit);
  1143.   if (gematcht[e] == true) {
  1144.     unterblossomliste[ubllit].typ = S;
  1145.     unterblossomliste[ubllit].kante = e;
  1146.   }
  1147.   else {
  1148.     unterblossomliste[ubllit].typ = T;
  1149.     unterblossomliste[ubllit].kante = e;
  1150.   }
  1151.   kantenlit = blossomliste[bllit].kantenliste.pred(kantenlit);
  1152.   ubzlit = blossomliste[bllit].ub_zeiger_liste.pred(ubzlit);
  1153. }
  1154. ubzlit = blossomliste[bllit].ub_zeiger_liste.last();
  1155. ubllit = blossomliste[bllit].ub_zeiger_liste[ubzlit];
  1156. e = blossomliste[bllit].kantenliste.inf(kantenlit);
  1157. unterblossomliste[ubllit].typ = T;
  1158. unterblossomliste[ubllit].kante = e;
  1159. ubzlit = ubzlit_kopie;
  1160. kantenlit = kantenlit_kopie;
  1161. ubzlit = blossomliste[bllit].ub_zeiger_liste.succ(ubzlit);
  1162. kantenlit = blossomliste[bllit].kantenliste.succ(kantenlit);
  1163. kantenlit = blossomliste[bllit].kantenliste.succ(kantenlit);
  1164. while (kantenlit != nil) {
  1165.   e = blossomliste[bllit].kantenliste[kantenlit];
  1166.   list_item ubllit = blossomliste[bllit].ub_zeiger_liste[ubzlit];
  1167.   list_item ubzlit_succ = blossomliste[bllit].ub_zeiger_liste.succ(ubzlit);
  1168.   list_item ubllit_succ = blossomliste[bllit].ub_zeiger_liste[ubzlit_succ];
  1169.   if (!unterblossomliste[ubllit].knotenliste.empty()) {
  1170.     list_item knotenlit = unterblossomliste[ubllit].knotenliste.first();
  1171.     while ((knotenlit != nil) && (unterblossomliste[ubllit].typ == UNMARKIERT)) {
  1172.       node i = unterblossomliste[ubllit].knotenliste[knotenlit];
  1173.       if (!brauchbare_kanten[i].empty()) {
  1174. edge e_brauchbar = brauchbare_kanten[i].pop();
  1175. unterblossomliste[ubllit].typ = T;
  1176. unterblossomliste[ubllit].kante = e_brauchbar;
  1177. unterblossomliste[ubllit_succ].typ = S;
  1178. unterblossomliste[ubllit_succ].kante = e;
  1179.       }
  1180.       knotenlit = unterblossomliste[ubllit].knotenliste.succ(knotenlit);
  1181.     }
  1182.   }
  1183.   else {
  1184.     node i = unterblossomliste[ubllit].basis;
  1185.     if (!brauchbare_kanten[i].empty()) {
  1186.       edge e_brauchbar = brauchbare_kanten[i].pop();
  1187.       unterblossomliste[ubllit].typ = T;
  1188.       unterblossomliste[ubllit].kante = e_brauchbar;
  1189.       unterblossomliste[ubllit_succ].typ = S;
  1190.       unterblossomliste[ubllit_succ].kante = e;
  1191.     }
  1192.   }
  1193.   if (!unterblossomliste[ubllit_succ].knotenliste.empty()) {
  1194.     list_item knotenlit = unterblossomliste[ubllit_succ].knotenliste.first();
  1195.     while ((knotenlit != nil) &&
  1196.       (unterblossomliste[ubllit_succ].typ == UNMARKIERT)) {
  1197.       node i = unterblossomliste[ubllit_succ].knotenliste[knotenlit];
  1198.       if (!brauchbare_kanten[i].empty()) {
  1199. edge e_brauchbar = brauchbare_kanten[i].pop();
  1200. unterblossomliste[ubllit_succ].typ = T;
  1201. unterblossomliste[ubllit_succ].kante = e_brauchbar;
  1202. unterblossomliste[ubllit].typ = S;
  1203. unterblossomliste[ubllit].kante = e;
  1204.       }
  1205.       knotenlit = unterblossomliste[ubllit_succ].knotenliste.succ(knotenlit);
  1206.     }
  1207.   }
  1208.   else {
  1209.     node i = unterblossomliste[ubllit_succ].basis;
  1210.     if (!brauchbare_kanten[i].empty()) {
  1211.       edge e_brauchbar = brauchbare_kanten[i].pop();
  1212.       unterblossomliste[ubllit_succ].typ = T;
  1213.       unterblossomliste[ubllit_succ].kante = e_brauchbar;
  1214.       unterblossomliste[ubllit].typ = S;
  1215.       unterblossomliste[ubllit].kante = e;
  1216.     }
  1217.   }
  1218.   ubzlit = blossomliste[bllit].ub_zeiger_liste.succ(ubzlit);
  1219.   ubzlit = blossomliste[bllit].ub_zeiger_liste.succ(ubzlit);
  1220.   kantenlit = blossomliste[bllit].kantenliste.succ(kantenlit);
  1221.   kantenlit = blossomliste[bllit].kantenliste.succ(kantenlit);
  1222. }
  1223.       }
  1224.       else if (gematcht[e] != true) {
  1225. list_item ubzlit_kopie = ubzlit;
  1226. list_item kantenlit_kopie = kantenlit;
  1227. kantenlit = blossomliste[bllit].kantenliste.succ(kantenlit);
  1228. ubzlit = blossomliste[bllit].ub_zeiger_liste.succ(ubzlit);
  1229. while (kantenlit != nil) {
  1230.   e = blossomliste[bllit].kantenliste.inf(kantenlit);
  1231.   ubllit = blossomliste[bllit].ub_zeiger_liste.inf(ubzlit);
  1232.   if (gematcht[e] == true) {
  1233.     unterblossomliste[ubllit].typ = S;
  1234.     unterblossomliste[ubllit].kante = e;
  1235.   }
  1236.   else {
  1237.     unterblossomliste[ubllit].typ = T;
  1238.     unterblossomliste[ubllit].kante = e;
  1239.   }
  1240.   kantenlit = blossomliste[bllit].kantenliste.succ(kantenlit);
  1241.   ubzlit = blossomliste[bllit].ub_zeiger_liste.succ(ubzlit);
  1242. }
  1243. ubzlit = ubzlit_kopie;
  1244. kantenlit = kantenlit_kopie;
  1245. ubzlit = blossomliste[bllit].ub_zeiger_liste.pred(ubzlit);
  1246. kantenlit = blossomliste[bllit].kantenliste.pred(kantenlit);
  1247. while (kantenlit != nil) {
  1248.   e = blossomliste[bllit].kantenliste[kantenlit];
  1249.   list_item ubllit = blossomliste[bllit].ub_zeiger_liste[ubzlit];
  1250.   list_item ubzlit_pred = blossomliste[bllit].ub_zeiger_liste.pred(ubzlit);
  1251.   list_item ubllit_pred = blossomliste[bllit].ub_zeiger_liste[ubzlit_pred];
  1252.   if (!unterblossomliste[ubllit].knotenliste.empty()) {
  1253.     list_item knotenlit = unterblossomliste[ubllit].knotenliste.first();
  1254.     while ((knotenlit != nil) && (unterblossomliste[ubllit].typ == UNMARKIERT)) {
  1255.       node i = unterblossomliste[ubllit].knotenliste[knotenlit];
  1256.       if (!brauchbare_kanten[i].empty()) {
  1257. edge e_brauchbar = brauchbare_kanten[i].pop();
  1258. unterblossomliste[ubllit].typ = T;
  1259. unterblossomliste[ubllit].kante = e_brauchbar;
  1260. unterblossomliste[ubllit_pred].typ = S;
  1261. unterblossomliste[ubllit_pred].kante = e;
  1262.       }
  1263.       knotenlit = unterblossomliste[ubllit].knotenliste.succ(knotenlit);
  1264.     }
  1265.   }
  1266.   else {
  1267.     node i = unterblossomliste[ubllit].basis;
  1268.     if (!brauchbare_kanten[i].empty()) {
  1269.       edge e_brauchbar = brauchbare_kanten[i].pop();
  1270.       unterblossomliste[ubllit].typ = T;
  1271.       unterblossomliste[ubllit].kante = e_brauchbar;
  1272.       unterblossomliste[ubllit_pred].typ = S;
  1273.       unterblossomliste[ubllit_pred].kante = e;
  1274.     }
  1275.   }
  1276.   if (!unterblossomliste[ubllit_pred].knotenliste.empty()) {
  1277.     list_item knotenlit = unterblossomliste[ubllit_pred].knotenliste.first();
  1278.     while ((knotenlit != nil) &&
  1279.       (unterblossomliste[ubllit_pred].typ == UNMARKIERT)) {
  1280.       node i = unterblossomliste[ubllit_pred].knotenliste[knotenlit];
  1281.       if (!brauchbare_kanten[i].empty()) {
  1282. edge e_brauchbar = brauchbare_kanten[i].pop();
  1283. unterblossomliste[ubllit_pred].typ = T;
  1284. unterblossomliste[ubllit_pred].kante = e_brauchbar;
  1285. unterblossomliste[ubllit].typ = S;
  1286. unterblossomliste[ubllit].kante = e;
  1287.       }
  1288.       knotenlit = unterblossomliste[ubllit_pred].knotenliste.succ(knotenlit);
  1289.     }
  1290.   }
  1291.   else {
  1292.     node i = unterblossomliste[ubllit_pred].basis;
  1293.     if (!brauchbare_kanten[i].empty()) {
  1294.       edge e_brauchbar = brauchbare_kanten[i].pop();
  1295.       unterblossomliste[ubllit_pred].typ = T;
  1296.       unterblossomliste[ubllit_pred].kante = e_brauchbar;
  1297.       unterblossomliste[ubllit].typ = S;
  1298.       unterblossomliste[ubllit].kante = e;
  1299.     }
  1300.   }
  1301.   ubzlit = blossomliste[bllit].ub_zeiger_liste.pred(ubzlit);
  1302.   ubzlit = blossomliste[bllit].ub_zeiger_liste.pred(ubzlit);
  1303.   kantenlit = blossomliste[bllit].kantenliste.pred(kantenlit);
  1304.   kantenlit = blossomliste[bllit].kantenliste.pred(kantenlit);
  1305. }
  1306.       }
  1307.       ubzlit = blossomliste[bllit].ub_zeiger_liste.first();
  1308.       while (ubzlit != nil) {
  1309. ubllit = blossomliste[bllit].ub_zeiger_liste.inf(ubzlit);
  1310. verschiebe_liste.append(ubllit);
  1311. ubzlit = blossomliste[bllit].ub_zeiger_liste.succ(ubzlit);
  1312.       }
  1313.       entferne_liste.append(bllit);
  1314.     }
  1315.     bllit = blossomliste.succ(bllit);
  1316.   }
  1317.   while (!entferne_liste.empty()) {
  1318.     blossomliste.del_item(entferne_liste.pop());
  1319.   }
  1320.   if (!verschiebe_liste.empty()) {
  1321.     list_item vlit = verschiebe_liste.first();
  1322.     list_item ubllit;
  1323.     while (vlit != nil) {
  1324.       ubllit = verschiebe_liste.inf(vlit);
  1325.       list_item hilfslit = blossomliste.append(unterblossomliste[ubllit]);
  1326.       unterblossomliste.del_item(verschiebe_liste.inf(vlit));
  1327.       if (!blossomliste[hilfslit].knotenliste.empty()) {
  1328. list_item knotenlit = blossomliste[hilfslit].knotenliste.first();
  1329. while (knotenlit != nil) {
  1330.   node i = blossomliste[hilfslit].knotenliste[knotenlit];
  1331.   blossom_zu_knoten[i] = hilfslit;
  1332.   knotenlit = blossomliste[hilfslit].knotenliste.succ(knotenlit);
  1333. }
  1334.       }
  1335.       else {
  1336. node i = blossomliste[hilfslit].basis;
  1337. blossom_zu_knoten[i] = hilfslit;
  1338.       }
  1339.       vlit = verschiebe_liste.succ(vlit);
  1340.     }
  1341.   }
  1342.   if (!verschiebe_liste.empty()) {
  1343.     list_item vlit = verschiebe_liste.first();
  1344.     list_item hilfslit = blossomliste.last();
  1345.     while (vlit != nil) {
  1346.       if (blossomliste[hilfslit].typ == S) {
  1347. neues_s_blossom
  1348.   (G, gewicht, u, blossomliste, blossom_zu_knoten, gematcht,
  1349.   blossomliste[hilfslit], ungescannt, brauchbare_kanten, d2_kante);
  1350.       }
  1351.       hilfslit = blossomliste.pred(hilfslit);
  1352.       vlit = verschiebe_liste.succ(vlit);
  1353.     }
  1354.   }
  1355. }
  1356. static void matchingtest(const ugraph &G, const edge_array <bool >&gematcht)
  1357. {
  1358.   node_array <bool >knoten_betrachtet(G, false);
  1359.   edge e;
  1360.   forall_edges (e, G) {
  1361.     node i = G.source(e);
  1362.     node j = G.target(e);
  1363.     if (gematcht[e] == true) {
  1364.       if (knoten_betrachtet[i] == false)
  1365. knoten_betrachtet[i] = true;
  1366.       else {
  1367. cout << "Knoten ";
  1368. G.print_node(i);
  1369. cout << " ist Endknoten mehrerer gematchter Kanten!!!n";
  1370.       }
  1371.       if (knoten_betrachtet[j] == false)
  1372. knoten_betrachtet[j] = true;
  1373.       else {
  1374. cout << "Knoten ";
  1375. G.print_node(j);
  1376. cout << " ist Endknoten mehrerer gematchter Kanten!!!n";
  1377.       }
  1378.     }
  1379.   }
  1380.   cout << "Test auf Matching abgeschlossen!n";
  1381.   return;
  1382. }
  1383. static void bed1test(const ugraph &G, const edge_array <GEWICHT_TYP > &gewicht, const
  1384.    node_array <DUALER_TYP > &u, const list <blossom > &blossomliste, const
  1385.    list <blossom > &unterblossomliste, const node_array <list_item >&blossom_zu_knoten)
  1386. {
  1387.   node i;
  1388.   forall_nodes (i, G) {
  1389.     if (u[i] < 0) {
  1390.       cout << "Die duale Variable von Knoten ";
  1391.       G.print_node(i);
  1392.       cout << " ist negativn";
  1393.     }
  1394.   }
  1395.   edge e;
  1396.   forall_edges (e, G) {
  1397.     node i = G.source(e);
  1398.     node j = G.target(e);
  1399.     if (i==j) continue;
  1400.     list_item litsource = blossom_zu_knoten[i];
  1401.     list_item littarget = blossom_zu_knoten[j];
  1402.     DUALER_TYP z;
  1403.     if (litsource != littarget)
  1404.       z = 0;
  1405.     else
  1406.       z = bestimme_z(G, blossomliste, unterblossomliste, blossomliste[litsource], e);
  1407.     DUALER_TYP pi = u[i] + u[j] - gewicht[e] + z;
  1408.     if (pi < 0) {
  1409.       cout << "pi<0 fuer Kante ";
  1410.       G.print_edge(e);
  1411.       cout << endl;
  1412.     }
  1413.   }
  1414.   if (!blossomliste.empty()) {
  1415.     list_item lit = blossomliste.first();
  1416.     while (lit != nil) {
  1417.       if (blossomliste[lit].z < 0) {
  1418. cout << "Es gibt ein z<0n";
  1419.       }
  1420.       lit = blossomliste.succ(lit);
  1421.     }
  1422.   }
  1423.   if (!unterblossomliste.empty()) {
  1424.     list_item lit = unterblossomliste.first();
  1425.     while (lit != nil) {
  1426.       if (unterblossomliste[lit].z < 0) {
  1427. cout << "Es gibt ein z<0n";
  1428.       }
  1429.       lit = unterblossomliste.succ(lit);
  1430.     }
  1431.   }
  1432.   cout << "Test von Bedingung (1) abgeschlossen!n";
  1433.   return;
  1434. }
  1435. static void bed2test(const ugraph &G, const edge_array <GEWICHT_TYP > &gewicht, const
  1436.    list <blossom > &blossomliste, const list <blossom > &unterblossomliste, const
  1437.    node_array <list_item >&blossom_zu_knoten, const edge_array <bool >&gematcht,
  1438.    const node_array <DUALER_TYP > &u)
  1439. {
  1440.   edge e;
  1441.   forall_edges (e, G) {
  1442.     if (gematcht[e] == true) {
  1443.       node i = G.source(e);
  1444.       node j = G.target(e);
  1445.       list_item litsource = blossom_zu_knoten[i];
  1446.       list_item littarget = blossom_zu_knoten[j];
  1447.       DUALER_TYP z;
  1448.       if (litsource != littarget)
  1449. z = 0;
  1450.       else
  1451. z = bestimme_z(G, blossomliste, unterblossomliste, blossomliste[litsource], e);
  1452.       DUALER_TYP pi = u[i] + u[j] - gewicht[e] + z;
  1453.       if (pi > 0) {
  1454. cout << "Kante ";
  1455. G.print_edge(e);
  1456. cout << " ist gematcht, aber pi ist positivn";
  1457.       }
  1458.     }
  1459.   }
  1460.   cout << "Test von Bedingung (2) abgeschlossen!n";
  1461.   return;
  1462. }
  1463. static void bed3test(const ugraph &G, const node_array <DUALER_TYP > &u, const
  1464.    node_array <edge >&gematchte_kante)
  1465. {
  1466.   node i;
  1467.   forall_nodes (i, G) {
  1468.     if (u[i] > 0) {
  1469.       if (gematchte_kante[i] == nil) {
  1470. cout << "Die duale Variable des freien Knotens ";
  1471. G.print_node(i);
  1472. cout << " ist positivn";
  1473.       }
  1474.     }
  1475.   }
  1476.   cout << "Test von Bedingung (3) abgeschlossen!n";
  1477.   return;
  1478. }
  1479. static void bed4test(const ugraph &G, const list <blossom > &blossomliste, const
  1480.    list <blossom > &unterblossomliste, const node_array <edge >&gematchte_kante,
  1481.    const node_array <list_item >&blossom_zu_knoten)
  1482. {
  1483.   if (!blossomliste.empty()) {
  1484.     list_item lit = blossomliste.first();
  1485.     while (lit != nil) {
  1486.       node_array <bool >schon_besucht(G, false);
  1487.       int anzknoten = 0;
  1488.       int anzgematchtekanten = 0;
  1489.       if ((blossomliste[lit].z > 0) &&
  1490. (!blossomliste[lit].knotenliste.empty())) {
  1491. list_item knotenlit = blossomliste[lit].knotenliste.first();
  1492. while (knotenlit != nil) {
  1493.   anzknoten++;
  1494.   node v = blossomliste[lit].knotenliste[knotenlit];
  1495.   if ((!schon_besucht[v]) && (gematchte_kante[v] != nil)) {
  1496.     schon_besucht[v] = true;
  1497.     edge e = gematchte_kante[v];
  1498.     node w = G.opposite(v, e);
  1499.     if (blossom_zu_knoten[w] == lit) {
  1500.       anzgematchtekanten++;
  1501.       schon_besucht[w] = true;
  1502.     }
  1503.   }
  1504.   knotenlit = blossomliste[lit].knotenliste.succ(knotenlit);
  1505. }
  1506. if (anzknoten != (2 * anzgematchtekanten + 1)) {
  1507.   cout << "Bedingung (4) ist verletzt!!!n";
  1508. }
  1509.       }
  1510.       lit = blossomliste.succ(lit);
  1511.     }
  1512.   }
  1513.   if (!unterblossomliste.empty()) {
  1514.     list_item lit = unterblossomliste.first();
  1515.     while (lit != nil) {
  1516.       node_array <bool >schon_besucht(G, false);
  1517.       int anzknoten = 0;
  1518.       int anzgematchtekanten = 0;
  1519.       if ((unterblossomliste[lit].z > 0) &&
  1520. (!unterblossomliste[lit].knotenliste.empty())) {
  1521. list_item knotenlit = unterblossomliste[lit].knotenliste.first();
  1522. while (knotenlit != nil) {
  1523.   anzknoten++;
  1524.   node v = unterblossomliste[lit].knotenliste[knotenlit];
  1525.   if ((!schon_besucht[v]) && (gematchte_kante[v] != nil)) {
  1526.     schon_besucht[v] = true;
  1527.     edge e = gematchte_kante[v];
  1528.     node w = G.opposite(v, e);
  1529.     list_item knotenlit2 = unterblossomliste[lit].knotenliste.first();
  1530.     while (knotenlit2 != nil) {
  1531.       if (unterblossomliste[lit].knotenliste[knotenlit2] == w) {
  1532. break;
  1533.       }
  1534.       knotenlit2 = unterblossomliste[lit].knotenliste.succ(knotenlit2);
  1535.     }
  1536.     if (knotenlit2 != nil) {
  1537.       anzgematchtekanten++;
  1538.       schon_besucht[w] = true;
  1539.     }
  1540.   }
  1541.   knotenlit = unterblossomliste[lit].knotenliste.succ(knotenlit);
  1542. }
  1543. if (anzknoten != (2 * anzgematchtekanten + 1)) {
  1544.   cout << "Bedingung (4) ist verletzt!!!n";
  1545. }
  1546.       }
  1547.       lit = unterblossomliste.succ(lit);
  1548.     }
  1549.   }
  1550.   cout << "Test von Bedingung (4) abgeschlossen!n";
  1551.   return;
  1552. }
  1553. static DUALER_TYP bestimme_z(const ugraph &G, const list <blossom > &blossomliste,
  1554.    const list <blossom > &unterblossomliste, const blossom & bl, const edge &e)
  1555. {
  1556.   DUALER_TYP z = bl.z;
  1557.   if (!bl.ub_zeiger_liste.empty()) {
  1558.     list_item ubzlit = bl.ub_zeiger_liste.first();
  1559.     while (ubzlit != nil) {
  1560.       int anzahl = 0;
  1561.       list_item ubllit = bl.ub_zeiger_liste[ubzlit];
  1562.       if (!unterblossomliste[ubllit].knotenliste.empty()) {
  1563. list_item knotenlit = unterblossomliste[ubllit].knotenliste.first();
  1564. while (knotenlit != nil) {
  1565.   node k = unterblossomliste[ubllit].knotenliste[knotenlit];
  1566.   if ((k == G.source(e)) || (k == G.target(e)))
  1567.     anzahl++;
  1568.   if (anzahl == 2)
  1569.     break;
  1570.   knotenlit = unterblossomliste[ubllit].knotenliste.succ(knotenlit);
  1571. }
  1572.       }
  1573.       if (anzahl == 2) {
  1574. z += bestimme_z(G, blossomliste, unterblossomliste,
  1575.   unterblossomliste[ubllit], e);
  1576. break;
  1577.       }
  1578.       else if (anzahl == 1)
  1579. break;
  1580.       ubzlit = bl.ub_zeiger_liste.succ(ubzlit);
  1581.     }
  1582.   }
  1583.   return z;
  1584. }