private SimpleGraph<Integer, DefaultEdge> buildGraphForTestDisconnected(int size) {
    SimpleGraph<Integer, DefaultEdge> graph = new SimpleGraph<>(DefaultEdge.class);

    VertexFactory<Integer> vertexFactory = new IntegerVertexFactory();

    CompleteGraphGenerator<Integer, DefaultEdge> completeGraphGenerator =
        new CompleteGraphGenerator<>(size);
    // two complete graphs
    SimpleGraph<Integer, DefaultEdge> east = new SimpleGraph<>(DefaultEdge.class);
    completeGraphGenerator.generateGraph(east, vertexFactory, null);

    SimpleGraph<Integer, DefaultEdge> west = new SimpleGraph<>(DefaultEdge.class);
    completeGraphGenerator.generateGraph(west, vertexFactory, null);

    Graphs.addGraph(graph, east);
    Graphs.addGraph(graph, west);
    // connected by single edge
    graph.addEdge(size - 1, size);

    return graph;
  }
  protected Graph<String, DefaultWeightedEdge> createWithBias(boolean negate) {
    Graph<String, DefaultWeightedEdge> g;
    double bias = 1;
    if (negate) {
      // negative-weight edges are being tested, so only a directed graph
      // makes sense
      g = new SimpleDirectedWeightedGraph<String, DefaultWeightedEdge>(DefaultWeightedEdge.class);
      bias = -1;
    } else {
      // by default, use an undirected graph
      g = new SimpleWeightedGraph<String, DefaultWeightedEdge>(DefaultWeightedEdge.class);
    }

    g.addVertex(V1);
    g.addVertex(V2);
    g.addVertex(V3);
    g.addVertex(V4);
    g.addVertex(V5);

    e12 = Graphs.addEdge(g, V1, V2, bias * 2);

    e13 = Graphs.addEdge(g, V1, V3, bias * 3);

    e24 = Graphs.addEdge(g, V2, V4, bias * 5);

    e34 = Graphs.addEdge(g, V3, V4, bias * 20);

    e45 = Graphs.addEdge(g, V4, V5, bias * 5);

    e15 = Graphs.addEdge(g, V1, V5, bias * 100);

    return g;
  }