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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _d.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/graph.h>
  12. #include <LEDA/p_queue.h>
  13. void DIJKSTRA(graph& G, 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.                                                                                
  22.   forall_nodes(v,G)
  23.   { pred[v] = nil;
  24.     dist[v] = MAXINT;
  25.    }
  26.   dist[s] = 0;
  27.   I[s] = PQ.insert(0,s);
  28.   while (! PQ.empty())
  29.   { pq_item it = PQ.find_min();
  30.     node u = PQ.inf(it);
  31.     int du = dist[u];
  32.     edge e;
  33.     forall_adj_edges(e,u)
  34.     { v = G.target(e);
  35.       int c = du + cost[e];
  36.       if (c < dist[v])
  37.       { if (dist[v] == MAXINT)
  38.           I[v] = PQ.insert(c,v);
  39.         else
  40.           PQ.decrease_p(I[v],c);
  41.         dist[v] = c;
  42.         pred[v] = e;
  43.        }                                                                 
  44.      }
  45.     PQ.del_item(it);
  46.    }
  47. }
  48. void DIJKSTRA(graph& G, node s, 
  49.               edge_array<int>&  cost, 
  50.               node_array<int>&  dist,
  51.               node_array<edge>& pred)
  52. {
  53.   p_queue<int,node>  PQ;
  54.   DIJKSTRA(G,s,cost,dist,pred,PQ);
  55.  }