main.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:2k
开发平台:

MultiPlatform

  1. /* This file has been automatically generated from "r_heap.w"
  2.    by CTANGLE (Version 3.1 [km2c]) */
  3. #include "r_heap.h"
  4. #include <LEDA/random.h>
  5. #include <LEDA/p_queue.h>
  6. #include <LEDA/_p_queue.h>
  7. #include <LEDA/graph.h>
  8. #include <LEDA/graph_alg.h>
  9. #include <fstream.h>
  10. #include <string.h>
  11. #include <math.h>
  12. void dijkstra(graph &G,
  13.    node s,
  14.    edge_array <int >&cost,
  15.    node_array <int >&dist,
  16.    node_array <edge >&pred,
  17.    p_queue < int, node >&PQ)
  18. {
  19.   node_array <pq_item >I(G);
  20.   node v;
  21.   forall_nodes (v, G) {
  22.     pred[v] = nil;
  23.     dist[v] = MAXINT;
  24.   }
  25.   dist[s] = 0;
  26.   I[s] = PQ.insert(0, s);
  27.   while (!PQ.empty()) {
  28.     pq_item it = PQ.find_min();
  29.     node u = PQ.inf(it);
  30.     int du = dist[u];
  31.     edge e;
  32.     forall_adj_edges (e, u) {
  33.       v = G.target(e);
  34.       int c = du + cost[e];
  35.       if (c < dist[v]) {
  36. if (dist[v] == MAXINT)
  37.   I[v] = PQ.insert(c, v);
  38. else
  39.   PQ.decrease_p(I[v], c);
  40. dist[v] = c;
  41. pred[v] = e;
  42.       }
  43.     }
  44.     PQ.del_item(it);
  45.   }
  46. }
  47. int main(void)
  48. {
  49.   GRAPH <int, int >G;
  50.   int n = read_int("# nodes = ");
  51.   int m = read_int("# edges = ");
  52.   random_graph(G, n, m);
  53.   edge_array <int >cost(G);
  54.   node_array <int >dist(G);
  55.   node_array <edge >pred(G);
  56.   int M = read_int("max edge cost = ");
  57.   node s = G.choose_node();
  58.   edge e;
  59.   forall_edges (e, G)
  60.     G[e] = cost[e] = rand_int(0, M);
  61.   p_queue < int, node >*PQ[2];
  62.   PQ[0] = new _p_queue < int, node, f_heap >;
  63.   PQ[1] = new _p_queue < int, node, r_heap > (M);
  64.   float T = used_time();
  65.   float t_f = 0.0, t_r = 0.0;
  66.   dijkstra(G, s, cost, dist, pred, *(PQ[0]));
  67.   t_f = used_time(T);
  68.   dijkstra(G, s, cost, dist, pred, *(PQ[1]));
  69.   t_r = used_time(T);
  70.   cout << string ("f_heap: %6.2f sec, r_heap: %6.2f secn", t_f, t_r);
  71. }