Índice
-
- INF 5010: Otimização combinatória
- INF 5016: Algoritmos avançados
- INF 5023: Técnicas de busca heurística.
Esta é uma versão antiga do documento!
Entrega: 23/08/2010
| Nome | MST | Nome | MST | Nome | MST |
|---|---|---|---|---|---|
| b01 | 238 | c01 | 2426 | msm0580 | 2141 |
| b02 | 238 | c02 | 2333 | msm0654 | 7333 |
| b03 | 217 | c03 | 2313 | msm0709 | 8837 |
| b04 | 196 | c04 | 2391 | msm0920 | 4195 |
| b05 | 167 | c05 | 2372 | msm1008 | 2381 |
| b06 | 168 | c06 | 1705 | msm1234 | 5252 |
| b07 | 341 | c07 | 1734 | msm1477 | 7110 |
| b08 | 343 | c08 | 1665 | msm1707 | 1713 |
| b09 | 331 | c09 | 1616 | msm1844 | 517 |
| b10 | 282 | c10 | 1669 | msm1931 | 5218 |
| b11 | 236 | c11 | 862 | msm2000 | 5333 |
| b12 | 253 | c12 | 895 | msm2152 | 12279 |
| b13 | 480 | c13 | 884 | msm2326 | 2525 |
| b14 | 463 | c14 | 855 | msm2492 | 23844 |
| b15 | 462 | c15 | 882 | msm2525 | 17518 |
| b16 | 319 | c16 | 503 | msm2601 | 17024 |
| b17 | 296 | c17 | 499 | msm2705 | 7646 |
| b18 | 337 | c18 | 503 | msm2802 | 9540 |
| c19 | 504 | msm2846 | 18494 | ||
| c20 | 509 | msm3277 | 9579 | ||
| msm3676 | 5948 | ||||
| msm3727 | 25659 | ||||
| msm3829 | 24972 | ||||
| msm4038 | 1436 | ||||
| msm4114 | 2333 | ||||
| msm4190 | 2270 | ||||
| msm4224 | 1094 | ||||
| msm4312 | 30628 | ||||
| msm4414 | 1996 | ||||
| msm4515 | 4488 |
#include <iostream> #include <cassert> using namespace std; #include <boost/graph/adjacency_list.hpp> #include <boost/graph/connected_components.hpp> #include <boost/graph/kruskal_min_spanning_tree.hpp> using namespace boost; // information stored in vertices struct VertexInformation { unsigned component; }; // information stored in edges struct EdgeInformation { unsigned weight; }; const unsigned maxweight = 1000; // graph is an adjacency list represented by vectors typedef adjacency_list<vecS, vecS, undirectedS,VertexInformation,EdgeInformation> Graph; typedef graph_traits<Graph>::vertex_descriptor Node; typedef graph_traits <Graph>::edge_descriptor Edge; int main(int argc, char *argv[]) { assert(argc == 3); unsigned n = atoi(argv[1]); double p = atof(argv[2]); srand48(time(0)); // (1) generate random graph Graph g; for(unsigned i=0; i<n; i++) add_vertex(g); for(unsigned i=0; i<n; i++) for(unsigned j=i+1; j<n; j++) if (drand48() < p) { Edge e = add_edge(i,j,g).first; g[e].weight = lrand48()%maxweight; } // (2) verify number of connected components unsigned cc = connected_components(g, get(&VertexInformation::component,g)); cout << cc << " connected components." << endl; if (cc>1) return 1; // (2.1) MST vector <Edge> mst; kruskal_minimum_spanning_tree(g, back_inserter(mst), weight_map(get(&EdgeInformation::weight,g))); unsigned cost = 0; for(vector<Edge>::iterator i=mst.begin(); i!=mst.end(); i++) cost += g[*i].weight; cout << "The weight of a MST is " << cost << "." << endl; // (3) print out in STP format cout << "SECTION Graph" << endl; cout << "Nodes " << num_vertices(g) << endl; cout << "Edges " << num_edges(g) << endl; graph_traits<Graph>::edge_iterator eb, ee; for ( tie(eb, ee)=edges(g); eb != ee; eb++) cout << "E " << source(*eb,g)+1 << " " << target(*eb, g)+1 << " " << g[*eb].weight << endl; }
Entrega: 06/09/2010