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

MultiPlatform

  1. #define LEDA_CHECKING_OFF
  2. #include <LEDA/graph_alg.h>
  3. #include <LEDA/_p_queue.h>
  4. void dijkstra(graph& G, 
  5.               node s, 
  6.               edge_array<int>&  cost, 
  7.               node_array<int>&  dist,
  8.               node_array<edge>& pred,
  9.               p_queue<int,node>&   PQ)
  10. {
  11.   node_array<pq_item> I(G);
  12.   node v;
  13.                                                                                
  14.   forall_nodes(v,G)
  15.   { pred[v] = nil;
  16.     dist[v] = MAXINT;
  17.    }
  18.   dist[s] = 0;
  19.   I[s] = PQ.insert(0,s);
  20.   while (! PQ.empty())
  21.   { pq_item it = PQ.find_min();
  22.     node u = PQ.inf(it);
  23.     int du = dist[u];
  24.     edge e;
  25.     forall_adj_edges(e,u)
  26.     { v = G.target(e);
  27.       int c = du + cost[e];
  28.       if (c < dist[v])
  29.       { if (dist[v] == MAXINT)
  30.           I[v] = PQ.insert(c,v);
  31.         else
  32.           PQ.decrease_p(I[v],c);
  33.         dist[v] = c;
  34.         pred[v] = e;
  35.        }                                                                 
  36.      }
  37.     PQ.del_item(it);
  38.    }
  39. }
  40. #include <LEDA/impl/k_heap.h>
  41. #include <LEDA/impl/bin_heap.h>
  42. #include <LEDA/impl/m_heap.h>
  43. #include <LEDA/impl/p_heap.h>
  44. #include <LEDA/impl/r_heap.h>
  45. #include <LEDA/impl/list_pq.h>
  46. main()
  47. {
  48.   GRAPH<int,int> G;
  49.   for(;;)
  50.   {
  51.   int n = read_int("# nodes = ");
  52.   int m = read_int("# edges = ");
  53.   if (n==0) break;
  54.   random_graph(G,n,m);
  55.   edge_array<int>  cost(G);
  56.   node_array<int>  dist0(G);
  57.   node_array<int>  dist(G);
  58.   node_array<edge> pred(G);
  59.   int M = read_int("max edge cost = ");
  60.   node s = G.choose_node();
  61.   edge e;
  62.   forall_edges(e,G) G[e] = cost[e] = rand_int(0,M);
  63.   p_queue<int,node>* PQ[8];
  64.   PQ[0] = new p_queue<int,node>;
  65.   PQ[1] = new _p_queue<int,node,k_heap>(n);
  66.   PQ[2] = new _p_queue<int,node,m_heap>(M);
  67.   PQ[3] = new _p_queue<int,node,list_pq>;
  68.   PQ[4] = new _p_queue<int,node,p_heap>;
  69.   PQ[5] = new _p_queue<int,node,r_heap>(M);
  70.   PQ[6] = new _p_queue<int,node,bin_heap>(n);
  71.   float T  = used_time();
  72.   cout << "DIJKSTRA: ";
  73.   cout.flush();
  74.   DIJKSTRA(G,s,cost,dist0,pred);
  75.   cout << string(" %6.2f secn",used_time(T));
  76.   newline;
  77.   string choice = "0:f_heap 1:k_heap 2:m_heap 3:list_pq 4:p_heap 5:r_heap 6:bin_heap --> ";
  78.   for(;;)
  79.   { int i = read_int(choice);
  80.     if (i>6) break;
  81.     float T  = used_time();
  82.     dijkstra(G,s,cost,dist,pred,*(PQ[i]));
  83.     cout << string("time: %6.2f secn",used_time(T));
  84.     newline;
  85.     node v;
  86.     forall_nodes(v,G)
  87.        if( dist[v] != dist0[v]) 
  88.        { G.print_node(v);
  89.          cout << string("   dist =  %d   dist0 = %dn",dist[v],dist0[v]);
  90.         }
  91.    }
  92.  }
  93.  return 0;
  94. }