Grafalgo
Library of useful data structures and algorithms
|
00001 // usage: allPairs method 00002 // 00003 // Allpairs reads a graph from stdin, computes a solution to the all pairs 00004 // shortest path problem using the specified method and prints the result. 00005 // 00006 00007 #include "stdinc.h" 00008 #include "Wdigraph.h" 00009 00010 using namespace grafalgo; 00011 00012 extern void dijkstraAll(Wdigraph&, int**, vertex**); 00013 extern void floyd(Wdigraph&, int**, vertex**); 00014 00015 int main(int argc, char *argv[]) { 00016 vertex u, v; string s; 00017 Wdigraph dig; cin >> dig; 00018 00019 if (argc != 2) Util::fatal("usage: allPairs method"); 00020 00021 if (strcmp(argv[1],"floyd") == 0) { 00022 int** dist = new int*[dig.n()+1]; 00023 vertex** mid = new vertex*[dig.n()+1]; 00024 for (u = 1; u <= dig.n(); u++) { 00025 dist[u] = new int[dig.n()+1]; 00026 mid[u] = new vertex[dig.n()+1]; 00027 } 00028 00029 floyd(dig,dist,mid); 00030 00031 cout << "distances\n\n "; 00032 for (v = 1; v <= dig.n(); v++) { 00033 cout << dig.item2string(v,s) << " "; 00034 } 00035 printf("\n"); 00036 for (u = 1; u <= dig.n(); u++) { 00037 cout << " " << dig.item2string(v,s) << ": "; 00038 for (v = 1; v <= dig.n(); v++) { 00039 cout << setw(3) << dist[u][v] << " "; 00040 } 00041 cout << endl; 00042 } 00043 cout << "\n\nmidpoint array\n\n "; 00044 for (v = 1; v <= dig.n(); v++) { 00045 cout << " " << dig.item2string(v,s) << " "; 00046 } 00047 cout << endl; 00048 for (u = 1; u <= dig.n(); u++) { 00049 cout << " " << dig.item2string(v,s) << ": "; 00050 for (v = 1; v <= dig.n(); v++) { 00051 cout << setw(3) << dig.item2string(mid[u][v],s) 00052 << " "; 00053 } 00054 cout << endl; 00055 } 00056 } else if (strcmp(argv[1],"dijkstra") == 0) { 00057 int** dist = new int*[dig.n()+1]; 00058 vertex** parent = new vertex*[dig.n()+1]; 00059 for (u = 1; u <= dig.n(); u++) { 00060 dist[u] = new int[dig.n()+1]; 00061 parent[u] = new vertex[dig.n()+1]; 00062 } 00063 00064 dijkstraAll(dig,dist,parent); 00065 00066 cout << "distances\n\n "; 00067 for (v = 1; v <= dig.n(); v++) { 00068 cout << " "<< dig.item2string(v,s) << " "; 00069 } 00070 cout << endl; 00071 for (u = 1; u <= dig.n(); u++) { 00072 cout << " " << dig.item2string(v,s) << ": "; 00073 for (v = 1; v <= dig.n(); v++) { 00074 cout << setw(3) << dist[u][v] << " "; 00075 } 00076 cout << endl; 00077 } 00078 00079 cout << "\n\nshortest path trees\n\n "; 00080 for (v = 1; v <= dig.n(); v++) { 00081 cout << " " << dig.item2string(v,s); 00082 } 00083 cout << endl; 00084 for (u = 1; u <= dig.n(); u++) { 00085 cout << " " << dig.item2string(v,s) << ": "; 00086 for (v = 1; v <= dig.n(); v++) { 00087 cout << setw(3) << dig.item2string( 00088 parent[u][v],s) 00089 << " "; 00090 } 00091 cout << endl; 00092 } 00093 } else { 00094 Util::fatal("allPairs: undefined method"); 00095 } 00096 }