Grafalgo
Library of useful data structures and algorithms
|
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 }