Grafalgo
Library of useful data structures and algorithms
/Users/jst/src/grafalgo/cpp/graphAlgorithms/sPath/dijkstraAll.cpp
00001 #include "stdinc.h"
00002 #include "Wdigraph.h"
00003 
00004 using namespace grafalgo;
00005 
00006 extern void dijkstra(Wdigraph&, vertex, vertex*, int*);
00007 extern void bfScan(Wdigraph&, vertex, vertex*, int*);
00008 
00009 void dijkstraAll(Wdigraph& dig, int* dist[], vertex* parent[]) {
00010 // Compute a solution to the all pairs shortest path problem
00011 // using Dijkstra's algorithm, with transformed edge lengths.
00012 // Return dist[u][v]=distance from u to v and 
00013 // parent[u][v]=parent of v in the shortest path tree rooted at u.
00014 
00015         vertex u,v; edge e;
00016 
00017         // Compute distances in augmented graph.
00018         vertex* p1 = new vertex[dig.n()+1];
00019         int* d1 = new int[dig.n()+1];
00020         bfScan(dig,1,p1,d1);
00021 
00022         // Modify edge costs.
00023         for (e = dig.first(); e != 0; e = dig.next(e)) {
00024                 u = dig.tail(e); v = dig.head(e);
00025                 dig.setLength(e,dig.length(e)+(d1[u]-d1[v]));
00026         }
00027 
00028         // Compute shortest paths & put inverse-transformed distances in dist.
00029         vertex* p2 = new vertex[dig.n()+1];
00030         int* d2 = new int[dig.n()+1];
00031         for (u = 1; u <= dig.n(); u++) {
00032                 dijkstra(dig,u,p2,d2);
00033                 for (v = 1; v <= dig.n(); v++) {
00034                         dist[u][v] = d2[v]-(d1[u]-d1[v]);
00035                         parent[u][v] = p2[v];
00036                 }
00037         }
00038 
00039         // Restore original edge costs.
00040         for (e = 1; e <= dig.m(); e++) {
00041                 u = dig.tail(e); v = dig.head(e);
00042                 dig.setLength(e,dig.length(e)-(d1[u]-d1[v]));
00043         }
00044 
00045         delete [] d1; delete[] p1; delete[] d2; delete [] p2;
00046 }
 All Classes Files Functions Variables Typedefs Friends