/** * Unit tests the {@code Bipartite} data type. * * @param args the command-line arguments */ public static void main(String[] args) { int V1 = Integer.parseInt(args[0]); int V2 = Integer.parseInt(args[1]); int E = Integer.parseInt(args[2]); int F = Integer.parseInt(args[3]); // create random bipartite graph with V1 vertices on left side, // V2 vertices on right side, and E edges; then add F random edges Graph G = GraphGenerator.bipartite(V1, V2, E); for (int i = 0; i < F; i++) { int v = StdRandom.uniform(V1 + V2); int w = StdRandom.uniform(V1 + V2); G.addEdge(v, w); } StdOut.println(G); Bipartite b = new Bipartite(G); if (b.isBipartite()) { StdOut.println("Graph is bipartite"); for (int v = 0; v < G.V(); v++) { StdOut.println(v + ": " + b.color(v)); } } else { StdOut.print("Graph has an odd-length cycle: "); for (int x : b.oddCycle()) { StdOut.print(x + " "); } StdOut.println(); } }
/** * Unit tests the {@code HopcroftKarp} data type. * Takes three command-line arguments {@code V1}, {@code V2}, and {@code E}; * creates a random bipartite graph with {@code V1} + {@code V2} vertices * and {@code E} edges; computes a maximum matching and minimum vertex cover; * and prints the results. * * @param args the command-line arguments */ public static void main(String[] args) { int V1 = Integer.parseInt(args[0]); int V2 = Integer.parseInt(args[1]); int E = Integer.parseInt(args[2]); Graph G = GraphGenerator.bipartite(V1, V2, E); if (G.V() < 1000) StdOut.println(G); BipartiteMatching matching = new BipartiteMatching(G); // print maximum matching StdOut.printf("Number of edges in max matching = %d\n", matching.size()); StdOut.printf("Number of vertices in min vertex cover = %d\n", matching.size()); StdOut.printf("Graph has a perfect matching = %b\n", matching.isPerfect()); StdOut.println(); if (G.V() >= 1000) return; StdOut.print("Max matching: "); for (int v = 0; v < G.V(); v++) { int w = matching.mate(v); if (matching.isMatched(v) && v < w) // print each edge only once StdOut.print(v + "-" + w + " "); } StdOut.println(); // print minimum vertex cover StdOut.print("Min vertex cover: "); for (int v = 0; v < G.V(); v++) if (matching.inMinVertexCover(v)) StdOut.print(v + " "); StdOut.println(); }
/** * Unit tests the {@code EulerianCycle} data type. * * @param args the command-line arguments */ public static void main(String[] args) { int V = Integer.parseInt(args[0]); int E = Integer.parseInt(args[1]); // Eulerian cycle Graph G1 = GraphGenerator.eulerianCycle(V, E); unitTest(G1, "Eulerian cycle"); // Eulerian path Graph G2 = GraphGenerator.eulerianPath(V, E); unitTest(G2, "Eulerian path"); // empty graph Graph G3 = new Graph(V); unitTest(G3, "empty graph"); // self loop Graph G4 = new Graph(V); int v4 = StdRandom.uniform(V); G4.addEdge(v4, v4); unitTest(G4, "single self loop"); // union of two disjoint cycles Graph H1 = GraphGenerator.eulerianCycle(V/2, E/2); Graph H2 = GraphGenerator.eulerianCycle(V - V/2, E - E/2); int[] perm = new int[V]; for (int i = 0; i < V; i++) perm[i] = i; StdRandom.shuffle(perm); Graph G5 = new Graph(V); for (int v = 0; v < H1.V(); v++) for (int w : H1.adj(v)) G5.addEdge(perm[v], perm[w]); for (int v = 0; v < H2.V(); v++) for (int w : H2.adj(v)) G5.addEdge(perm[V/2 + v], perm[V/2 + w]); unitTest(G5, "Union of two disjoint cycles"); // random digraph Graph G6 = GraphGenerator.simple(V, E); unitTest(G6, "simple graph"); }
/** * Unit tests the {@code EulerianPath} data type. * * @param args the command-line arguments */ public static void main(String[] args) { int V = Integer.parseInt(args[0]); int E = Integer.parseInt(args[1]); // Eulerian cycle Graph G1 = GraphGenerator.eulerianCycle(V, E); unitTest(G1, "Eulerian cycle"); // Eulerian path Graph G2 = GraphGenerator.eulerianPath(V, E); unitTest(G2, "Eulerian path"); // add one random edge Graph G3 = new Graph(G2); G3.addEdge(StdRandom.uniform(V), StdRandom.uniform(V)); unitTest(G3, "one random edge added to Eulerian path"); // self loop Graph G4 = new Graph(V); int v4 = StdRandom.uniform(V); G4.addEdge(v4, v4); unitTest(G4, "single self loop"); // single edge Graph G5 = new Graph(V); G5.addEdge(StdRandom.uniform(V), StdRandom.uniform(V)); unitTest(G5, "single edge"); // empty graph Graph G6 = new Graph(V); unitTest(G6, "empty graph"); // random graph Graph G7 = GraphGenerator.simple(V, E); unitTest(G7, "simple graph"); }