22 #ifndef SHORTEST_PATHS_H 23 #define SHORTEST_PATHS_H 33 #include "libcola/commondefs.h" 34 #include <libvpsc/pairing_heap.h> 35 #include <libvpsc/assertions.h> 47 std::vector<Node<T>*> neighbours;
48 std::vector<T> nweights;
49 PairNode<Node<T>*>* qnode;
53 bool operator() (Node<T> *
const &u, Node<T> *
const &v)
const {
54 if(u==v)
return false;
64 typedef std::pair<unsigned,unsigned>
Edge;
73 void neighbours(
unsigned const n, T** D, std::vector<Edge>
const & es,
74 std::valarray<T>
const & eweights = std::valarray<T>());
83 void floyd_warshall(
unsigned const n, T** D, std::vector<Edge>
const & es,
84 std::valarray<T>
const & eweights = std::valarray<T>());
94 void johnsons(
unsigned const n, T** D, std::vector<Edge>
const & es,
95 std::valarray<T>
const & eweights = std::valarray<T>());
104 template <
typename T>
105 void dijkstra(
unsigned const s,
unsigned const n, T* d,
106 std::vector<Edge>
const & es,
107 std::valarray<T>
const & eweights = std::valarray<T>());
115 template <
typename T>
119 std::vector<Edge>
const & es,
120 std::valarray<T>
const & eweights)
122 COLA_ASSERT((eweights.size() == 0) || (eweights.size() == es.size()));
123 for(
unsigned i=0;i<n;i++) {
124 for(
unsigned j=0;j<n;j++) {
126 else D[i][j]=std::numeric_limits<T>::max();
129 for(
unsigned i=0;i<es.size();i++) {
130 unsigned u=es[i].first, v=es[i].second;
131 COLA_ASSERT(u<n&&v<n);
132 D[u][v] = D[v][u] = (eweights.size() > 0) ? eweights[i] : 1;
134 for(
unsigned k=0; k<n; k++) {
135 for(
unsigned i=0; i<n; i++) {
136 for(
unsigned j=0; j<n; j++) {
137 D[i][j]=std::min(D[i][j],D[i][k]+D[k][j]);
143 template <
typename T>
147 std::vector<Edge>
const & es,
148 std::valarray<T>
const & eweights)
150 COLA_ASSERT((eweights.size() == 0) || (eweights.size() == es.size()));
151 for(
unsigned i=0;i<n;i++) {
152 for(
unsigned j=0;j<n;j++) {
156 for(
unsigned i=0;i<es.size();i++) {
157 unsigned u=es[i].first, v=es[i].second;
158 COLA_ASSERT(u<n&&v<n);
159 D[u][v] = D[v][u] = (eweights.size() > 0) ? eweights[i] : 1;
162 template <
typename T>
164 std::vector<Node<T> > & vs,
165 std::vector<Edge>
const& es,
166 std::valarray<T>
const & eweights) {
167 COLA_ASSERT((eweights.size() == 0) || (eweights.size() == es.size()));
169 const unsigned n=vs.size();
171 for(
unsigned i=0;i<es.size();i++) {
172 unsigned u=es[i].first, v=es[i].second;
175 T w = (eweights.size() > 0) ? eweights[i] : 1;
176 vs[u].neighbours.push_back(&vs[v]);
177 vs[u].nweights.push_back(w);
178 vs[v].neighbours.push_back(&vs[u]);
179 vs[v].nweights.push_back(w);
182 template <
typename T>
185 std::vector<Node<T> > & vs,
188 const unsigned n=vs.size();
190 for(
unsigned i=0;i<n;i++) {
192 vs[i].d=std::numeric_limits<T>::max();
196 PairingHeap<Node<T>*,CompareNodes<T> > Q;
197 for(
unsigned i=0;i<n;i++) {
198 vs[i].qnode = Q.insert(&vs[i]);
200 while(!Q.isEmpty()) {
201 Node<T> *u=Q.extractMin();
203 for(
unsigned i=0;i<u->neighbours.size();i++) {
204 Node<T> *v=u->neighbours[i];
206 if(u->d!=std::numeric_limits<T>::max()
210 Q.decreaseKey(v->qnode,v);
215 template <
typename T>
220 std::vector<Edge>
const & es,
221 std::valarray<T>
const & eweights)
223 COLA_ASSERT((eweights.size() == 0) || (eweights.size() == es.size()));
225 std::vector<Node<T> > vs(n);
226 dijkstra_init(vs,es,eweights);
230 template <
typename T>
234 std::vector<Edge>
const & es,
235 std::valarray<T>
const & eweights)
237 std::vector<Node<T> > vs(n);
238 dijkstra_init(vs,es,eweights);
239 for(
unsigned k=0;k<n;k++) {
245 #endif //SHORTEST_PATHS_H Definition: shortest_paths.h:40
std::pair< unsigned, unsigned > Edge
Edges are simply a pair of indices to entries in the Node vector.
Definition: cola.h:68