- inline void del_edge(Edge *e) {
- if(e == first_edge) { first_edge = e->next; }
- if(e->pred) { e->pred->next = e->next; }
- if(e->next) { e->next->pred = e->pred; }
- }
-};
-
-class Graph {
- void initialize_work_lengths();
- void update_work_length();
- void find_shortest_path(Vertex **front, Vertex **new_front);
-
- int nb_vertices;
- Edge *edge_heap;
- Vertex *vertices;
- Vertex *source, *sink;
-
-public:
- Graph(int nb_vertices, int nb_edges, int *from, int *to, scalar_t *lengths,
- int source, int sink);
-
- ~Graph();
-
- void find_best_paths();
- void print();
- void print_occupied_edges();
- void dot_print();
-};
-
-void Graph::print() {
- for(int n = 0; n < nb_vertices; n++) {
- for(Edge *e = vertices[n].first_edge; e; e = e->next) {
- cout << n << " -> " << e->terminal_vertex->id << " " << e->length << endl;
- }
- }
-}
-
-void Graph::print_occupied_edges() {
- for(int n = 0; n < nb_vertices; n++) {
- for(Edge *e = vertices[n].first_edge; e; e = e->next) {
- if(e->occupied) {
- int a = n, b = e->terminal_vertex->id;
- if(a > b) { int c = a; a = b; b = c; }
- cout << a << " " << b << endl;
- }
- }
- }
-}
-
-void Graph::dot_print() {
- cout << "digraph {" << endl;
- cout << " node[shape=circle];" << endl;
- for(int n = 0; n < nb_vertices; n++) {
- for(Edge *e = vertices[n].first_edge; e; e = e->next) {
- int a = n, b = e->terminal_vertex->id;
- if(e->occupied) {
- int c = a; a = b; b = c;
- cout << " " << a << " -> " << b << " [style=bold,color=black,label=\"" << -e->length << "\"];" << endl;
- } else {
- cout << " " << a << " -> " << b << " [color=gray,label=\"" << e->length << "\"];" << endl;
- }
- }
- }
- cout << "}" << endl;
-}
-
-Graph::Graph(int nb_vrt, int nb_edges,
- int *from, int *to, scalar_t *lengths,
- int src, int snk) {
- nb_vertices = nb_vrt;
-
- edge_heap = new Edge[nb_edges];
- vertices = new Vertex[nb_vertices];
-
- source = &vertices[src];
- sink = &vertices[snk];
-
- for(int v = 0; v < nb_vertices; v++) {
- vertices[v].id = v;
- }
-
- for(int e = 0; e < nb_edges; e++) {
- vertices[from[e]].add_edge(&edge_heap[e]);
- edge_heap[e].occupied = 0;
- edge_heap[e].length = lengths[e];
- edge_heap[e].terminal_vertex = &vertices[to[e]];
- }
-}
-
-Graph::~Graph() {
- delete[] vertices;
- delete[] edge_heap;
-}