/* ========================================== * JGraphT : a free Java graph-theory library * ========================================== * * Project Info: http://org.org.jgrapht.sourceforge.net/ * Project Creator: Barak Naveh (http://sourceforge.net/users/barak_naveh) * * (C) Copyright 2003-2010, by Barak Naveh and Contributors. * * This program and the accompanying materials are dual-licensed under * either * * (a) the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation, or (at your option) any * later version. * * or (per the licensee's choosing) * * (b) the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation. */ /* ------------------------------ * MinimumSpanningTreeTest.java * ------------------------------ * (C) Copyright 2010-2010, by Tom Conerly and Contributors. * * Original Author: Tom Conerly * Contributor(s): - * * Changes * ------- * 02-Feb-2010 : Initial revision (TC); * */ package org.jgrapht.alg; import junit.framework.TestCase; import org.jgrapht.Graph; import org.jgrapht.Graphs; import org.jgrapht.alg.interfaces.MinimumSpanningTree; import org.jgrapht.graph.DefaultWeightedEdge; import org.jgrapht.graph.SimpleWeightedGraph; import java.util.Arrays; import java.util.Collection; public class MinimumSpanningTreeTest extends TestCase { //~ Static fields/initializers --------------------------------------------- private static final String A = "A"; private static final String B = "B"; private static final String C = "C"; private static final String D = "D"; private static final String E = "E"; private static final String F = "F"; private static final String G = "G"; private static final String H = "H"; //~ Instance fields -------------------------------------------------------- private DefaultWeightedEdge AB; private DefaultWeightedEdge AC; private DefaultWeightedEdge AE; private DefaultWeightedEdge BD; private DefaultWeightedEdge CD; private DefaultWeightedEdge DE; private DefaultWeightedEdge EF; private DefaultWeightedEdge EG; private DefaultWeightedEdge GH; private DefaultWeightedEdge FH; //~ Methods ---------------------------------------------------------------- public void testKruskal() { testMinimumSpanningTreeBuilding( new KruskalMinimumSpanningTree<String, DefaultWeightedEdge>(createSimpleConnectedWeightedGraph()), Arrays.asList(AB, AC, BD, DE), 15.0 ); testMinimumSpanningTreeBuilding( new KruskalMinimumSpanningTree<String, DefaultWeightedEdge>(createSimpleDisconnectedWeightedGraph()), Arrays.asList(AB, AC, BD, EG, GH, FH), 60.0 ); testKruskalMinimumSpanningTreeBuildingBackwardCompatibility( new KruskalMinimumSpanningTree<String, DefaultWeightedEdge>(createSimpleConnectedWeightedGraph()), Arrays.asList(AB, AC, BD, DE), 15.0 ); } public void testPrim() { testMinimumSpanningTreeBuilding( new PrimMinimumSpanningTree<String, DefaultWeightedEdge>(createSimpleConnectedWeightedGraph()), Arrays.asList(AB, AC, BD, DE), 15.0 ); testMinimumSpanningTreeBuilding( new PrimMinimumSpanningTree<String, DefaultWeightedEdge>(createSimpleDisconnectedWeightedGraph()), Arrays.asList(AB, AC, BD, EG, GH, FH), 60.0 ); } protected <V, E> void testMinimumSpanningTreeBuilding( final MinimumSpanningTree<V, DefaultWeightedEdge> mst, final Collection<E> edgeSet, final double weight) { assertEquals(weight, mst.getMinimumSpanningTreeTotalWeight()); assertTrue(mst.getMinimumSpanningTreeEdgeSet().containsAll(edgeSet)); } protected <V, E> void testKruskalMinimumSpanningTreeBuildingBackwardCompatibility( final KruskalMinimumSpanningTree<V, DefaultWeightedEdge> mst, final Collection<E> edgeSet, final double weight) { assertEquals(weight, mst.getSpanningTreeCost()); assertTrue(mst.getEdgeSet().containsAll(edgeSet)); } protected Graph<String, DefaultWeightedEdge> createSimpleDisconnectedWeightedGraph() { Graph<String, DefaultWeightedEdge> g = new SimpleWeightedGraph<String, DefaultWeightedEdge>(DefaultWeightedEdge.class); /** * * A -- B E -- F * | | | | * C -- D G -- H * */ g.addVertex(A); g.addVertex(B); g.addVertex(C); g.addVertex(D); AB = Graphs.addEdge(g, A, B, 5); AC = Graphs.addEdge(g, A, C, 10); BD = Graphs.addEdge(g, B, D, 15); CD = Graphs.addEdge(g, C, D, 20); g.addVertex(E); g.addVertex(F); g.addVertex(G); g.addVertex(H); EF = Graphs.addEdge(g, E, F, 20); EG = Graphs.addEdge(g, E, G, 15); GH = Graphs.addEdge(g, G, H, 10); FH = Graphs.addEdge(g, F, H, 5); return g; } protected Graph<String, DefaultWeightedEdge> createSimpleConnectedWeightedGraph() { Graph<String, DefaultWeightedEdge> g = new SimpleWeightedGraph<String, DefaultWeightedEdge>(DefaultWeightedEdge.class); double bias = 1; g.addVertex(A); g.addVertex(B); g.addVertex(C); g.addVertex(D); g.addVertex(E); AB = Graphs.addEdge(g, A, B, bias * 2); AC = Graphs.addEdge(g, A, C, bias * 3); BD = Graphs.addEdge(g, B, D, bias * 5); CD = Graphs.addEdge(g, C, D, bias * 20); DE = Graphs.addEdge(g, D, E, bias * 5); AE = Graphs.addEdge(g, A, E, bias * 100); return g; } } // End MinimumSpanningTreeTest.java