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