/* -*- C++ -*- * * This file is a part of LEMON, a generic C++ optimization library * * Copyright (C) 2003-2008 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport * (Egervary Research Group on Combinatorial Optimization, EGRES). * * Permission to use, modify and distribute this software is granted * provided that this copyright notice appears in all copies. For * precise terms see the accompanying LICENSE file. * * This software is provided "AS IS" with no warranty of any kind, * express or implied, and with no claim as to its suitability for any * purpose. * */ #include #include #include "test_tools.h" #include #include #include #include #include #include using namespace std; using namespace lemon; void checkCompileKruskal() { concepts::WriteMap w; concepts::WriteMap uw; concepts::ReadMap r; concepts::ReadMap ur; concepts::Graph g; concepts::UGraph ug; kruskal(g, r, w); kruskal(ug, ur, uw); std::vector > rs; std::vector > urs; kruskal(g, rs, w); kruskal(ug, urs, uw); std::vector ws; std::vector uws; kruskal(g, r, ws.begin()); kruskal(ug, ur, uws.begin()); Kruskal > alg(ug, ur); alg.init(); alg.initPresorted(uws.begin(), uws.end()); alg.reinit(); alg.emptyQueue(); alg.nextEdge(); alg.processNextEdge(); alg.processEdge(concepts::UGraph::UEdge()); alg.run(); alg.treeMap(); alg.tree(concepts::UGraph::UEdge()); } int main() { typedef ListUGraph::Node Node; typedef ListUGraph::UEdge UEdge; typedef ListUGraph::NodeIt NodeIt; typedef ListUGraph::EdgeIt EdgeIt; ListUGraph G; Node s=G.addNode(); Node v1=G.addNode(); Node v2=G.addNode(); Node v3=G.addNode(); Node v4=G.addNode(); Node t=G.addNode(); UEdge e1 = G.addEdge(s, v1); UEdge e2 = G.addEdge(s, v2); UEdge e3 = G.addEdge(v1, v2); UEdge e4 = G.addEdge(v2, v1); UEdge e5 = G.addEdge(v1, v3); UEdge e6 = G.addEdge(v3, v2); UEdge e7 = G.addEdge(v2, v4); UEdge e8 = G.addEdge(v4, v3); UEdge e9 = G.addEdge(v3, t); UEdge e10 = G.addEdge(v4, t); typedef ListUGraph::UEdgeMap ECostMap; typedef ListUGraph::UEdgeMap EBoolMap; ECostMap edge_cost_map(G, 2); EBoolMap tree_map(G); //Test with const map. check(kruskal(G, ConstMap(2), tree_map)==10, "Total cost should be 10"); //Test with a edge map (filled with uniform costs). check(kruskal(G, edge_cost_map, tree_map)==10, "Total cost should be 10"); edge_cost_map.set(e1, -10); edge_cost_map.set(e2, -9); edge_cost_map.set(e3, -8); edge_cost_map.set(e4, -7); edge_cost_map.set(e5, -6); edge_cost_map.set(e6, -5); edge_cost_map.set(e7, -4); edge_cost_map.set(e8, -3); edge_cost_map.set(e9, -2); edge_cost_map.set(e10, -1); vector tree_edge_vec(5); //Test with a edge map and inserter. check(kruskal(G, edge_cost_map, tree_edge_vec.begin()) ==-31, "Total cost should be -31."); tree_edge_vec.clear(); check(kruskal(G, edge_cost_map, back_inserter(tree_edge_vec)) ==-31, "Total cost should be -31."); // tree_edge_vec.clear(); // //The above test could also be coded like this: // check(kruskal(G, // makeKruskalMapInput(G, edge_cost_map), // makeKruskalSequenceOutput(back_inserter(tree_edge_vec))) // ==-31, // "Total cost should be -31."); check(tree_edge_vec.size()==5,"The tree should have 5 edges."); check(tree_edge_vec[0]==e1 && tree_edge_vec[1]==e2 && tree_edge_vec[2]==e5 && tree_edge_vec[3]==e7 && tree_edge_vec[4]==e9, "Wrong tree."); Kruskal ka(G, edge_cost_map); ka.run(); check(ka.tree(e1) && ka.tree(e2) && ka.tree(e5) && ka.tree(e7) && ka.tree(e9), "Wrong tree."); check(ka.treeValue() == -31, "Total cost should be -31."); return 0; }