예제 #1
0
  /**
   * @param graph
   * @return
   */
  public SimpleEdge pickRandomEdge(ArrayList<ArrayList<Integer>> graph) {

    SimpleEdge edge = new SimpleEdge();
    int max = graph.size();

    int beginRandomIndex = AlgoHelper.randomNumber(0, max);
    ArrayList<Integer> t = graph.get(beginRandomIndex);

    int randomVertix = AlgoHelper.randomNumber(1, t.size());
    int randomIndex = findEndIndex(graph, t.get(randomVertix));

    if (beginRandomIndex < randomIndex) {
      edge.setBeginVertix(beginRandomIndex);
      edge.setEndVertix(randomIndex);
    } else {
      edge.setBeginVertix(randomIndex);
      edge.setEndVertix(beginRandomIndex);
    }

    return edge;
  }
예제 #2
0
  /**
   * karger's min cut algorithm
   *
   * <p>While there are more than 2 vertices: • pick a remaining edge (u,v) uniformly at random •
   * merge (or “contract” ) u and v into a single vertex • remove self-loops return cut represented
   * by final 2 vertices. 8
   *
   * @param graph graph represented as adjacenty list
   * @return computed minCut value
   */
  public long kargerMinCutAlgo(ArrayList<ArrayList<Integer>> graph) {

    int numberOfVertices = graph.size();

    // verticiesIndex -  vertex's(ArrayList<Integer>) index in graph arrayList
    SimpleEdge verticiesIndex = null;

    // verticiesLabel - vertex label (the first integer value in ArrayList<Integer>)
    SimpleEdge verticiesLabel = new SimpleEdge();
    while (numberOfVertices != 2) {
      verticiesIndex = pickRandomEdge(graph);

      verticiesLabel.setBeginVertix(graph.get(verticiesIndex.getBeginVertix()).get(0));
      verticiesLabel.setEndVertix(graph.get(verticiesIndex.getEndVertix()).get(0));

      mergeTwoVertices(graph, verticiesIndex);
      refreshGraph(graph, verticiesLabel);
      numberOfVertices--;
    }
    return graph.get(0).size() - 1;
  }