Beispiel #1
0
 /**
  * Computes a minimum cut of the edge-weighted graph. Precisely, it computes
  * the lightest of the cuts-of-the-phase which yields the desired minimum
  * cut.
  * 
  * @param G the edge-weighted graph
  * @param a the starting vertex
  */
 private void minCut(EdgeWeightedGraph G, int a) {
     UF uf = new UF(G.V());
     boolean[] marked = new boolean[G.V()];
     cut = new boolean[G.V()];
     CutPhase cp = new CutPhase(0.0, a, a);
     for (int v = G.V(); v > 1; v--) {
         cp = minCutPhase(G, marked, cp);
         if (cp.weight < weight) {
             weight = cp.weight;
             makeCut(cp.t, uf);
         }
         G = contractEdge(G, cp.s, cp.t);
         marked[cp.t] = true;
         uf.union(cp.s, cp.t);
     }
 }
Beispiel #2
0
 /**
  * Returns the cut-of-the-phase. The cut-of-the-phase is a minimum s-t-cut
  * in the current graph, where {@code s} and {@code t} are the two vertices
  * added last in the phase. This algorithm is known in the literature as
  * <em>maximum adjacency search</em> or <em>maximum cardinality search</em>.
  * 
  * @param G the edge-weighted graph
  * @param marked the array of contracted vertices, where {@code marked[v]}
  *            is {@code true} if the vertex {@code v} was already
  *            contracted; or {@code false} otherwise
  * @param cp the previous cut-of-the-phase
  * @return the cut-of-the-phase
  */
 private CutPhase minCutPhase(EdgeWeightedGraph G, boolean[] marked, CutPhase cp) {
     IndexMaxPQ<Double> pq = new IndexMaxPQ<Double>(G.V());
     for (int v = 0; v < G.V(); v++) {
         if (v != cp.s && !marked[v]) pq.insert(v, 0.0);
     }
     pq.insert(cp.s, Double.POSITIVE_INFINITY);
     while (!pq.isEmpty()) {
         int v = pq.delMax();
         cp.s = cp.t;
         cp.t = v;
         for (Edge e : G.adj(v)) {
             int w = e.other(v);
             if (pq.contains(w)) pq.increaseKey(w, pq.keyOf(w) + e.weight());
         }
     }
     cp.weight = 0.0;
     for (Edge e : G.adj(cp.t)) {
         cp.weight += e.weight();
     }
     return cp;
 }