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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _min_cut.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 "min_cut.w"
  12.    by CTANGLE (Version 3.1 [km2c]) */
  13. #include <LEDA/graph_alg.h>
  14. #include <LEDA/ugraph.h>
  15. #include <LEDA/stream.h>
  16. #include <LEDA/node_pq.h>
  17. list <node >MIN_CUT(const graph &G0, edge_array <int >&weight)
  18. {
  19.   typedef list <node >nodelist;
  20.   UGRAPH < nodelist *, int >G;
  21.   node v, x;
  22.   edge e;
  23.   node_array <node >partner(G0);
  24.   forall_nodes (x, G0) {
  25.     partner[x] = G.new_node(new nodelist);
  26.     G[partner[x]]->append(x);
  27.   }
  28.   forall_edges (e, G0)
  29.     if (source(e) != target(e))
  30.       G.new_edge(partner[source(e)], partner[target(e)], weight[e]);
  31.   node a = G.first_node();
  32.   int n = G.number_of_nodes();
  33.   list <node >best_cut;
  34.   int best_value = MAXINT;
  35.   int cut_weight;
  36. /* |n| is now the number of nodes of the current graph and |a|
  37.      is a fixed vertex */
  38.   while (n >= 2) {
  39.     node t = a;
  40.     node s;
  41.     node_array <bool >in_PQ(G);
  42.     node_pq <int >PQ(G);
  43.     forall_nodes (v, G)
  44.       if (v != a) {
  45. PQ.insert(v, 0); /* $w(v,A) = 0$ if there is no edge
  46.  * connecting |v| to |A| */
  47. in_PQ[v] = true;
  48.       }
  49.       else {
  50. in_PQ[v] = false;
  51.       }
  52.     {
  53.       forall_adj_edges (e, a)
  54. PQ.decrease_inf(G.opposite(a, e), PQ.inf(G.opposite(a, e)) - G[e]);
  55.     }
  56.     while (!PQ.empty()) {
  57.       s = t;
  58.       cut_weight = -PQ.inf(PQ.find_min());
  59.       t = PQ.del_min();
  60.       in_PQ[t] = false;
  61.       forall_adj_edges (e, t) {
  62. if (in_PQ[v = G.opposite(t, e)])
  63.   PQ.decrease_inf(v, PQ.inf(v) - G[e]);
  64.       }
  65.     }
  66.     ;
  67.     if (cut_weight < best_value) {
  68.       best_cut = *(G[t]);
  69.       best_value = cut_weight;
  70.     }
  71.     G[s]->conc(*(G[t]));
  72.     node_array <edge >s_edge(G, nil);
  73.     {
  74.       forall_adj_edges (e, s)
  75. s_edge[G.opposite(s, e)] = e;
  76.     }
  77.     {
  78.       forall_adj_edges (e, t) {
  79. if (s_edge[v = G.opposite(t, e)] == nil)
  80.   G.new_edge(s, v, G[e]);
  81. else
  82.   G[s_edge[v]] += G[e];
  83.       }
  84.     }
  85.     delete G[t];
  86.     G.del_node(t);
  87.     ;
  88.     n--;
  89.   }
  90.   return best_cut;
  91. }