COIN-OR::LEMON - Graph Library

Changeset 78:ecc1171307be in lemon-0.x for src/work/jacint/dijkstra.hh


Ignore:
Timestamp:
02/16/04 17:15:58 (20 years ago)
Author:
jacint
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@101
Message:

modern valtozat

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/work/jacint/dijkstra.hh

    r50 r78  
    22 *dijkstra
    33 *by jacint
    4  *Performs Dijkstra's algorithm from node s.
     4 *Performs Dijkstra's algorithm from Node s.
    55 *
    66 *Constructor:
    77 *
    8  *dijkstra(graph_type& G, node_iterator s, edge_property_vector& distance)
     8 *dijkstra(graph_type& G, NodeIt s, EdgeMap& distance)
    99 *
    1010 *
     
    1717 *
    1818 *
    19  *T dist(node_iterator v) : returns the distance from s to v.
     19 *T dist(NodeIt v) : returns the distance from s to v.
    2020 *   It is 0 if v is not reachable from s.
    2121 *
    2222 *
    23  *edge_iterator pred(node_iterator v)
    24  *   Returns the last edge of a shortest s-v path.
     23 *EdgeIt pred(NodeIt v)
     24 *   Returns the last Edge of a shortest s-v path.
    2525 *   Returns an invalid iterator if v=s or v is not
    2626 *   reachable from s.
    2727 *
    2828 *
    29  *bool reach(node_iterator v) : true if v is reachable from s
     29 *bool reach(NodeIt v) : true if v is reachable from s
    3030 *
    3131 *
     
    4949
    5050#include <marci_graph_traits.hh>
    51 #include <marci_property_vector.hh>
     51#include <marciMap.hh>
    5252
    5353
     
    6161    template <typename graph_type, typename T>
    6262    class dijkstra{
    63       typedef typename graph_traits<graph_type>::node_iterator node_iterator;
    64       typedef typename graph_traits<graph_type>::edge_iterator edge_iterator;
    65       typedef typename graph_traits<graph_type>::each_node_iterator each_node_iterator;
    66       typedef typename graph_traits<graph_type>::in_edge_iterator in_edge_iterator;
    67       typedef typename graph_traits<graph_type>::out_edge_iterator out_edge_iterator;
     63      typedef typename graph_traits<graph_type>::NodeIt NodeIt;
     64      typedef typename graph_traits<graph_type>::EdgeIt EdgeIt;
     65      typedef typename graph_traits<graph_type>::EachNodeIt EachNodeIt;
     66      typedef typename graph_traits<graph_type>::InEdgeIt InEdgeIt;
     67      typedef typename graph_traits<graph_type>::OutEdgeIt OutEdgeIt;
    6868     
    6969     
    7070      graph_type& G;
    71       node_iterator s;
    72       node_property_vector<graph_type, edge_iterator> predecessor;
    73       node_property_vector<graph_type, T> distance;
    74       edge_property_vector<graph_type, T> length;
    75       node_property_vector<graph_type, bool> reached;
     71      NodeIt s;
     72      NodeMap<graph_type, EdgeIt> predecessor;
     73      NodeMap<graph_type, T> distance;
     74      EdgeMap<graph_type, T> length;
     75      NodeMap<graph_type, bool> reached;
    7676         
    7777  public :
    7878
    7979    /*
    80       The distance of all the nodes is 0.
     80      The distance of all the Nodes is 0.
    8181    */
    82     dijkstra(graph_type& _G, node_iterator _s, edge_property_vector<graph_type, T>& _length) :
     82    dijkstra(graph_type& _G, NodeIt _s, EdgeMap<graph_type, T>& _length) :
    8383      G(_G), s(_s), predecessor(G, 0), distance(G, 0), length(_length), reached(G, false) { }
    8484   
     
    8686     
    8787      /*By Misi.*/
    88       struct node_dist_comp
     88      struct Node_dist_comp
    8989      {
    90         node_property_vector<graph_type, T> &d;
    91         node_dist_comp(node_property_vector<graph_type, T> &_d) : d(_d) {}
     90        NodeMap<graph_type, T> &d;
     91        Node_dist_comp(NodeMap<graph_type, T> &_d) : d(_d) {}
    9292       
    93         bool operator()(const node_iterator& u, const node_iterator& v) const
     93        bool operator()(const NodeIt& u, const NodeIt& v) const
    9494        { return d.get(u) < d.get(v); }
    9595      };
     
    9999      void run() {
    100100       
    101         node_property_vector<graph_type, bool> scanned(G, false);
    102         std::priority_queue<node_iterator, vector<node_iterator>, node_dist_comp>
    103           heap(( node_dist_comp(distance) ));
     101        NodeMap<graph_type, bool> scanned(G, false);
     102        std::priority_queue<NodeIt, vector<NodeIt>, Node_dist_comp>
     103          heap(( Node_dist_comp(distance) ));
    104104     
    105105        heap.push(s);
     
    108108        while (!heap.empty()) {
    109109
    110           node_iterator v=heap.top();   
     110          NodeIt v=heap.top(); 
    111111          heap.pop();
    112112
     
    114114          if (!scanned.get(v)) {
    115115       
    116             for(out_edge_iterator e=G.first_out_edge(v); e.valid(); ++e) {
    117               node_iterator w=G.head(e);
     116            for(OutEdgeIt e=G.template first<OutEdgeIt>(v); e.valid(); ++e) {
     117              NodeIt w=G.head(e);
    118118
    119119              if (!scanned.get(w)) {
     
    148148
    149149      /*
    150        *Returns the distance of the node v.
    151        *It is 0 for the root and for the nodes not
     150       *Returns the distance of the Node v.
     151       *It is 0 for the root and for the Nodes not
    152152       *reachable form the root.
    153153       */     
    154       T dist(node_iterator v) {
     154      T dist(NodeIt v) {
    155155        return -distance.get(v);
    156156      }
     
    159159
    160160      /*
    161        *  Returns the last edge of a shortest s-v path.
     161       *  Returns the last Edge of a shortest s-v path.
    162162       *  Returns an invalid iterator if v=root or v is not
    163163       *  reachable from the root.
    164164       */     
    165       edge_iterator pred(node_iterator v) {
     165      EdgeIt pred(NodeIt v) {
    166166        if (v!=s) { return predecessor.get(v);}
    167         else {return edge_iterator();}
     167        else {return EdgeIt();}
    168168      }
    169169     
    170170
    171171     
    172       bool reach(node_iterator v) {
     172      bool reach(NodeIt v) {
    173173        return reached.get(v);
    174174      }
Note: See TracChangeset for help on using the changeset viewer.