-typedef float scalar_t;
-
-#ifdef DEBUG
-#define ASSERT(x) if(!(x)) { \
- std::cerr << "ASSERT FAILED IN " << __FILE__ << ":" << __LINE__ << endl; \
- abort(); \
-}
-#else
-#define ASSERT(x)
-#endif
-
-class Vertex;
-
-class Edge {
-public:
- int occupied;
- scalar_t length, work_length;
- Vertex *terminal_vertex;
- Edge *next, *pred;
-};
-
-class Vertex {
-public:
- int id;
- // These are the leaving edges
- Edge *first_edge;
- scalar_t distance;
-
- Vertex *pred_vertex;
- Edge *pred_edge;
-
- Vertex() { first_edge = 0; }
-
- inline void add_edge(Edge *e) {
- if(first_edge) { first_edge->pred = e; }
- e->next = first_edge;
- e->pred = 0;
- first_edge = e;
- }
-
- 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 {
-public:
- int nb_vertices;
- Edge *edge_heap;
- Vertex *vertices;
- Vertex *source, *sink;
-
- Graph(int nb_vertices, int nb_edges, int *from, int *to, scalar_t *lengths,
- int source, int sink);
- ~Graph();
-
- void initialize_work_lengths();
- void update_work_length();
- void find_shortest_path();
- void find_best_paths();
- void print();
- void print_occupied_edges();
-};
-
-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;
- }
- }
- }
-}
-
-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];