Example #1
0
  /** Does not handle Graphs of 1 or fewer nodes */
  public Graph kruskal(Graph g) {
    boolean add = false;
    Graph mst = new Graph(); // initialize graph
    Vector edges = g.getEdges(); // get edges

    Collections.sort(edges); // sort edges

    // find mst
    for (int i = 0; i < edges.size(); ++i) {
      Edge edge = (Edge) edges.get(i); // get edge
      KNode[] ends = edge.getEnds(); // get ends
      if (!mst.containsNode(ends[0])) {
        mst.addNode(ends[0]); // check for first end
        add = true;
      }
      if (!mst.containsNode(ends[1])) {
        mst.addNode(ends[1]); // check other end
        add = true;
      }

      if (add) // if either end is new add edge
      {
        mst.addEdge(edge);
        add = false;
      } else // ensure trees are connected if nodes are contained
      {
        if (!mst.pathBetween(ends)) mst.addEdge(edge);
      }
    }

    return mst;
  }