home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / leda / src / graph_al / _mcb_mat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  3.0 KB  |  122 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  _mcb_matching.c
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16. /*******************************************************************************
  17. *                                                                              *
  18. *  MAX_CARD_BIPARTITE_MATCHING  (maximum cardinality bipartite matching)       *
  19. *                                                                              *
  20. *******************************************************************************/
  21.  
  22.  
  23.  
  24. #include <LEDA/graph_alg.h>
  25.  
  26. edge find_next_augmenting_path(graph&,node, node, node_array(edge)&, node_array(int)&);
  27. /* defined later */
  28.  
  29. list(edge) MAX_CARD_BIPARTITE_MATCHING(graph& G, const list(node)& A, 
  30.                                                  const list(node)& B )
  31. { // G is a bipartite graph with sides A and B, all edges must be directed 
  32.   // from A to B. We compute a matching of maximum cardinality using the 
  33.   // algorithm of Hopcroft and Karp. The running time is O(sqrt(n)*m).
  34.  
  35. node v;
  36. edge e;
  37.  
  38. forall(v,B) 
  39.    forall_adj_edges(e,v) 
  40.       { error_handler(0,"mcb_matching: edge from B to A (deleted).");
  41.         G.del_edge(e);  
  42.        }
  43.  
  44. node s = G.new_node("s");
  45. node t = G.new_node("t");
  46.  
  47. forall(v,A) G.new_edge(s,v);
  48. forall(v,B) G.new_edge(v,t);
  49.  
  50. node_array(edge) pred(G,0); 
  51. node_array(int)  layer(G,0);
  52. list(edge) EL;
  53. list(node) L;
  54.  
  55. G.reset();
  56.  
  57. for(;;)
  58. { forall_nodes(v,G) { layer[v] = -1; pred[v] = 0; }
  59.  
  60.   L = BFS(G,s,layer);
  61.  
  62.   if (layer[t]>=0)  // there is at least one augmenting path
  63.    { while (e = find_next_augmenting_path(G,s,t,pred,layer)) EL.append(e); 
  64.  
  65.      G.reset();
  66.      while (e=EL.pop())
  67.        { edge x = pred[source(e)];
  68.          while (source(x) != s)
  69.            { G.rev_edge(x);
  70.              x=pred[target(x)];
  71.             }
  72.          G.del_edge(e);  // edge into t
  73.          G.del_edge(x);  // edge out of s
  74.         } 
  75.     }
  76.   else break;
  77.  
  78. list(edge) result;
  79.  
  80. forall(v,B) 
  81.    forall_adj_edges(e,v) 
  82.       if (target(e) != t) 
  83.         result.append(e);
  84.       else
  85.         EL.append(e);
  86.  
  87. //restore graph:
  88. forall(e,EL) G.del_edge(e);
  89. forall(e,result) G.rev_edge(e);
  90. G.del_node(s);
  91. G.del_node(t);
  92.  
  93. return result;
  94. }
  95.  
  96.  
  97. // edges in the layered network are called eligible:
  98. #define ELIGIBLE(e)\
  99. (layer[target(e)]==layer[source(e)]+1) && (layer[target(e)]<=layer[t])
  100.  
  101.  
  102. edge find_next_augmenting_path(graph& G, node s, node t, node_array(edge)& pred, 
  103.                                          node_array(int)&  layer)
  104. { node w;
  105.   edge e;
  106.   edge f=0;
  107.  
  108.   while (f==0 && G.next_adj_edge(e,s))
  109.     if (ELIGIBLE(e))
  110.       if ((w=target(e))==t) f=e;              // t is reached
  111.       else  if (pred[w]==0)                   // w not reached before 
  112.             { pred[w] = e;
  113.               f = find_next_augmenting_path(G,w,t,pred,layer);
  114.              }
  115.   return f;
  116.  
  117.  
  118.  
  119.