Ticket #10395: prim_boost.cpp

File prim_boost.cpp, 2.1 KB (added by cristiano.sousa126@…, 8 years ago)

Test code

Line 
1#include <boost/config.hpp>
2#include <iostream>
3#include <boost/graph/adjacency_list.hpp>
4#include <boost/graph/prim_minimum_spanning_tree.hpp>
5#include <boost/graph/kruskal_min_spanning_tree.hpp>
6
7
8int main(int argc, char* argv[]){
9 using namespace boost;
10 typedef adjacency_list < vecS, vecS, undirectedS, property<vertex_distance_t, unsigned>, property < edge_weight_t, unsigned > > Graph;
11 typedef std::pair < unsigned, unsigned >E;
12 typedef graph_traits < Graph >::edge_descriptor Edge;
13
14 FILE *fp = fopen(argv[1], "r");
15 if(!fp)
16 {
17 printf("Could not open file\n");
18 return 1;
19 }
20
21 unsigned nedges, nnodes;
22 char buffer[1000];
23 while(fgets(buffer, 999,fp) != NULL)
24 {
25 if(buffer[0] != 'c') break;
26 }
27
28 if(strstr(buffer, "p sp") == NULL)
29 {
30 printf("Malformed file\n");
31 return 1;
32 }
33
34 sscanf(buffer, "p sp %u %u\n", &nnodes, &nedges);
35 printf("graph has %u %u\n", nnodes, nedges);
36
37 while(fgets(buffer, 999,fp) != NULL)
38 {
39 if(buffer[0] != 'c') break;
40 }
41
42
43 E *edges = (E*)calloc(nedges, sizeof(E));
44 unsigned *weights = (unsigned*)calloc(nedges, sizeof(unsigned));
45 unsigned src, dst, wt;
46 unsigned top_edge = 0;
47
48 while(fscanf(fp, "a %u %u %u\n", &src, &dst, &wt) != EOF)
49 {
50 edges[top_edge] = E(src-1, dst-1);
51 weights[top_edge] = wt;
52 top_edge++;
53 }
54
55
56 Graph g(edges, &(edges[top_edge]), weights, nnodes);
57 std::vector < graph_traits < Graph >::vertex_descriptor > p(num_vertices(g));
58 std::vector<unsigned int> distances(num_vertices(g));
59 std::vector < Edge > spanning_tree;
60 property_map < Graph, edge_weight_t >::type weight = get(edge_weight, g);
61
62 prim_minimum_spanning_tree(g, &p[0], root_vertex(1).distance_map(&distances[0]));
63 long unsigned int total_weight = 0;
64
65 for (std::size_t i = 0; i != p.size(); ++i)
66 {
67 if (p[i] != i)
68 {
69 total_weight += distances[i];
70 }
71 }
72 printf("Prim total mst weight %lu\n", total_weight);
73
74
75 kruskal_minimum_spanning_tree(g, std::back_inserter(spanning_tree));
76
77 total_weight = 0;
78 for(std::vector < Edge >::iterator ei = spanning_tree.begin(); ei != spanning_tree.end(); ++ei)
79 {
80 total_weight += weight[*ei];
81 }
82 printf("Kruskal total mst weight %lu\n", total_weight);
83
84 return 0;
85}