Índice
-
- INF 5010: Otimização combinatória
- INF 5016: Algoritmos avançados
- INF 5023: Técnicas de busca heurística.
Nome | T1 | T2 | T3 | T4 | T5 |
---|---|---|---|---|---|
Garren | ✓✓ | ✓✓ | ✓✓ | ✓✓ | |
Germano | ✓✓ | ✓✓ | |||
Guilherme | ✓✓ | ✓✓ | ✓✓ | ✓✓ | ✓✓ |
Ivan | ✓✓ | ✓✓ | ✓✓ | ✓✓ | ✓✓ |
Lucas Oliveira | ✓✓ | ✓✓ | ✓✓ | ✓✓ | ✓✓ |
Lucas Santos | ✓✓ | ✓✓ | |||
Marco | ✓✓ | ✓✓ | ✓✓ | ✓✓ | ✓✓ |
Rafael | ✓✓ | ✓✓ | ✓✓ | ✓✓ | ✓✓ |
Rodrigo | ✓✓ |
✓: recebido. ✓✓: avaliado.
Entrega: 7 de dezembro 2022.
> ./dijkstra 1 2 < NY.gr 803
/** * \file gen.cpp * \author Marcus Ritt <mrpritt@inf.ufrgs.br> * \date Time-stamp: <2011-08-24 15:17:49 ritt> */ #include <iostream> #include <cassert> using namespace std; #include <boost/graph/adjacency_list.hpp> #include <boost/graph/connected_components.hpp> #include <boost/graph/dijkstra_shortest_paths.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, directedS,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=0; j<n; j++) if (i != j && drand48() < p) { Edge e = add_edge(i,j,g).first; g[e].weight = lrand48()%maxweight; } // (2) print example path unsigned src = lrand48()%num_vertices(g); unsigned dst = lrand48()%num_vertices(g); vector<unsigned> dist(n); vector<unsigned> pred(n); dijkstra_shortest_paths(g,src,weight_map(get(&EdgeInformation::weight,g)).distance_map(&dist[0]).predecessor_map(&pred[0])); cerr << "Distance between " << src+1 << " and " << dst+1 << " is " << dist[dst] << endl; // (3) print out in DIMACS challenge format cout << "p sp " << num_vertices(g) << " " << num_edges(g) << endl; graph_traits<Graph>::edge_iterator eb, ee; for ( tie(eb, ee)=edges(g); eb != ee; eb++) cout << "a " << source(*eb,g)+1 << " " << target(*eb, g)+1 << " " << g[*eb].weight << endl; }
void read_dimacs(std::istream& in, unsigned& n, unsigned& m, MyGraph& a) { std::string line="", dummy; while (line.substr(0,4) != "p sp") getline(in,line); // (1) get nodes and edges std::stringstream linestr; linestr.str(line); linestr >> dummy >> dummy >> n >> m; a.resize(n); unsigned i=0; while (i<m) { getline(in,line); if (line.substr(0,2) == "a ") { std::stringstream arc(line); unsigned u,v,w; char ac; arc >> ac >> u >> v >> w; // processar arco (u,v) com peso w i++; } } }
Entrega: 18 de janeiro de 2023.
To use: cc washington.c -o gengraph gengraph function arg1 arg2 arg3 Command line arguments have the following meanings: function: index of desired graph type arg1, arg2, arg3: meanings depend on graph type (briefly listed below: see code comments for more info) Mesh Graph: 1 rows cols maxcapacity Random Level Graph: 2 rows cols maxcapacity Random 2-Level Graph:3 rows cols maxcapacity Matching Graph: 4 vertices degree Square Mesh: 5 side degree maxcapacity Basic Line: 6 rows cols degree Exponential Line: 7 rows cols degree Double Exponential 8 rows cols degree DinicBadCase: 9 vertices (causes n augmentation phases) GoldBadCase 10 vertices Cheryian 11 dim1 dim2 range (last 2 are bad for goldberg's algorithm)
No. | Nome | Parâmetros | Descrição | n | m |
---|---|---|---|---|---|
1 | Mesh | r,c | Grade, 3 viz. 1 direita | rc+2 | 3r(c-1) |
2 | Random level | r,c | Grade, 3 viz. rand. 1 direita | rc+2 | 3r(c-1) |
3 | Random 2-level | r,c | Grade, 3 viz. rand. 2 direita | rc+2 | 3r(c-1) |
4 | Matching | n,d | Bipart. n-n, d viz. rand. | 2n+2 | n(d+2) |
5 | Square Mesh | d,D | Quadr. mesh dxd, grau D | d*d+2 | (d-1)dD+2d |
6 | BasicLine | n,m,D | Linha, grau D | nm+2 | nmD+2m |
7 | ExpLine | n,m,D | Linha, grau D | nm+2 | nmD+2m |
8 | DExpLine | n,m,D | Linha, grau D | nm+2 | nmD+2m |
9 | DinicBad | n | Linha | n | 2n-3 |
10 | GoldBad | n | 3n+3 | 4n+1 |
/** * \file maxflow.cpp * \author Marcus Ritt <mrpritt@inf.ufrgs.br> * \date Time-stamp: <2015-09-22 21:17:31 ritt> * * Read a maximum flow problem in DIMACS format and output the maximum flow. * */ #include <iostream> #include <cstring> using namespace std; #include <boost/graph/adjacency_list.hpp> #include <boost/graph/read_dimacs.hpp> #include <boost/graph/push_relabel_max_flow.hpp> using namespace boost; // graph element descriptors typedef adjacency_list_traits<vecS,vecS,directedS>::vertex_descriptor DiNode; typedef adjacency_list_traits<vecS,vecS,directedS>::edge_descriptor Edge; // a directed graph with reverse edges struct VertexInformation {}; typedef unsigned Capacity; struct EdgeInformation { Capacity edge_capacity; Capacity edge_residual_capacity; Edge reverse_edge; }; typedef adjacency_list<vecS,vecS,directedS,VertexInformation,EdgeInformation> DiGraph; int main(int argc, char *argv[]) { // (0) read graph DiGraph g; DiNode s,t; read_dimacs_max_flow(g, get(&EdgeInformation::edge_capacity,g), get(&EdgeInformation::reverse_edge,g), s, t); // (1) determine maximum flow cout << push_relabel_max_flow(g, s, t, get(&EdgeInformation::edge_capacity,g), get(&EdgeInformation::edge_residual_capacity,g), get(&EdgeInformation::reverse_edge,g), get(boost::vertex_index, g)); }
Gerar uma instância aleatória: ./opm --w 10 --h 10 --ins test.ins; display opm.pbm Visualizar uma solução: ./opm --ins test.ins --sol test.sol --pbm vis.pbm; display vis.pbm Converter PBM para PNG (Linux/ImageMagick): convert vis.pbm vis.png
w h p11 p12 ... p1w p21 p22 ... p2w ... ph1 ph2 ... phw
w h s11 s12 ... s1w s21 s22 ... s2w ... sh1 sh2 ... shw
Entrega: 10/03/2023
n p11 p12 p13 ... p1n p21 p22 p23 ... p2n ... pn1 pn2 pn3 ... pnn
com pij o peso entre vértice i do primeiro parte do grafo e vértice j do segundo parte.
Entrega: 31/03/2023
#include <iostream> using namespace std; #include <gmpxx.h> int main(int argc, char *argv[]) { mpz_class a; cin >> a; cout << "O quadrado de " << a << " é " << a*a << endl; }