Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
graph.cpp
Go to the documentation of this file.
1
29#include <map>
30#include <vector>
31#include <queue>
32#include <iostream>
33#include <string>
34
35#include <examples.h>
36
37typedef std::map<std::string, int> Distances;
38typedef std::map<std::string, Distances> Cities;
39typedef std::pair<unsigned, std::string> DistancePair;
40
42
43 return lhs.first < rhs.first;
44}
45
46
48
49 return lhs.first > rhs.first;
50}
51
52
53static void
54shortestDistance (Cities &city_map,
55 const std::string &start_city,
57{
58
59 // Process a priority queue of distances to nodes.
60 std::priority_queue<DistancePair,
61 std::vector<DistancePair,
62 std::allocator<DistancePair> >,
63 std::greater<DistancePair> > que;
64
65 que.push (DistancePair (0, start_city));
66
67 while (! que.empty ()) {
68
69 // Pull nearest city from queue.
70 int distance = que.top ().first;
71 std::string city = que.top ().second;
72 que.pop ();
73
74 // If we haven't seen it already, process it.
75 if (0 == dist.count (city))
76 {
77 // Then add it to shortest distance map.
78 dist[city] = distance;
79
80 // And put values into queue.
81 const Distances& cities = city_map[city];
82 Distances::const_iterator start = cities.begin ();
83 Distances::const_iterator stop = cities.end ();
84
85 for (; start != stop; ++start)
86 que.push (DistancePair (distance + (*start).second,
87 (*start).first));
88 }
89 }
90}
91
92
93int main () {
94
95 std::cout << "Graph example program "
96 << " - find shortest path in a directed graph."
97 << std::endl;
98
99 static const char pendleton[] = "Pendleton";
100 static const char pensacola[] = "Pensacola";
101 static const char peoria[] = "Peoria";
102 static const char phoenix[] = "Phoenix";
103 static const char pierre[] = "Pierre";
104 static const char pittsburgh[] = "Pittsburgh";
105 static const char princeton[] = "Princeton";
106 static const char pueblo[] = "Pueblo";
107
108 Cities cityMap;
109
110 cityMap[pendleton][phoenix] = 4;
111 cityMap[pendleton][pueblo] = 8;
112 cityMap[pensacola][phoenix] = 5;
113 cityMap[peoria][pittsburgh] = 5;
114 cityMap[peoria][pueblo] = 3;
115 cityMap[phoenix][peoria] = 4;
116 cityMap[phoenix][pittsburgh] = 10;
117 cityMap[phoenix][pueblo] = 3;
118 cityMap[pierre][pendleton] = 2;
119 cityMap[pittsburgh][pensacola] = 4;
120 cityMap[princeton][pittsburgh] = 2;
121 cityMap[pueblo][pierre] = 3;
122
124
125 shortestDistance (cityMap, pierre, dist);
126 Distances::iterator where;
127
128 std::cout << "Find the shortest path from : "
129 << pierre << '\n';
130
131 for (where = dist.begin (); where != dist.end (); ++where)
132 std::cout << " Distance to: " << (*where).first << ":"
133 << (*where).second << '\n';
134
135 std::cout << "End of graph example program" << '\n';
136
137 return 0;
138}
void distance(T, T,...)
#define rhs
Definition 17.names.cpp:536
#define start
Definition 17.names.cpp:547
#define dist
Definition 17.names.cpp:464
#define lhs
Definition 17.names.cpp:489
std::map< std::string, Distances > Cities
Definition graph.cpp:38
bool operator<(const DistancePair &lhs, const DistancePair &rhs)
Definition graph.cpp:41
std::map< std::string, int > Distances
Definition graph.cpp:37
bool operator>(const DistancePair &lhs, const DistancePair &rhs)
Definition graph.cpp:47
int main()
Definition graph.cpp:93
std::pair< unsigned, std::string > DistancePair
Definition graph.cpp:39