1. source codes /* * max flow, using Edmonds-Karp algorithm */ void AdjMatrixGraph::maxFlow(int s, int t) { // f : storing the flow int *f = new int[v * v]; for (int i = 0; i < v; i++) { for (int j = 0; j < v; j++) { f[i * v + j] = 0; } } while (true) { dijkstra(s, t); Edges *es = Edges::getInstance(); if (!es->isEmpty()) { cout << endl; cout << "the shortest path from "<< s << " to "<< t << " is like following "<< endl; Edge *e = es->head; while (e) { cout << e << endl; e = e->next; } } if (es->isEmpty()) { // no argument path from s to t break; } else { // get the min c in the shortest path from s to t int wmin = std::numeric_limits<int>::max(); Edge* p = es->head; while (p) { int _w = p->weight; if (_w < wmin) { wmin = _w; } p = p->next; } //cout << "min container in the path is "<< wmin << endl; // update the flow value in the path p = es->head; while (p) { int from = p->from; int to = p->to; f[from * v + to] += wmin; //f[to * v + from] = -f[from * v + to]; A[from * v + to] -= wmin; if (A[from * v + to] == 0) { A[from * v + to] = std::numeric_limits<int>::max(); } p = p->next; } // // print the container matrix // for (int i = 0; i < v; i++) { // for (int j = 0; j < v; j++) { // cout << A[i * v + j]<< " "; // } // cout << endl; // } } } int maxflow = 0; for (int i = 0; i < v; i++) { maxflow += f[s * v + i]; } cout << endl; cout << "max flow from source "<< s << " to sink "<< t << " is "<< maxflow << endl; } 2. test suite #include "../ch22/Edge.h" #include "../ch22/Graph.h" #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { Edge e[] = { { 1, 2, 16 }, { 1, 3, 13 }, { 2, 3, 10 }, { 2, 4, 12 }, { 3, 2, 4 }, { 4, 3, 9 }, { 4, 6, 20 }, { 5, 4, 7 }, { 5, 6, 4 }, { 3, 5, 14 } }; Edges* edges = Edges::getInstance(); for (unsigned int i = 0; i < sizeof(e)/sizeof(Edge); i++) { edges->insert(&(e[i])); } int numberOfVertexes = 6; AdjMatrixGraph *g1 = new AdjMatrixGraph(numberOfVertexes, edges, true, true); MatrixGraphBuilder* mgb = MatrixGraphBuilder::getInstance(); g1->build(mgb); g1->display(); g1->maxFlow(0, 5); } 3. test result 0 16 13 2147483647 2147483647 2147483647 2147483647 0 10 12 2147483647 2147483647 2147483647 4 0 2147483647 14 2147483647 2147483647 2147483647 9 0 2147483647 20 2147483647 2147483647 2147483647 7 0 4 2147483647 2147483647 2147483647 2147483647 2147483647 0 dijkstra run result : vertex 0 is selected with parent -1, and distance from vertext 0 is 0 vertex 1 is selected with parent 0, and distance from vertext 0 is 16 vertex 2 is selected with parent 0, and distance from vertext 0 is 13 vertex 3 is selected with parent 1, and distance from vertext 0 is 28 vertex 4 is selected with parent 2, and distance from vertext 0 is 27 vertex 5 is selected with parent 4, and distance from vertext 0 is 31 the shortest path from 0 to 5 is like following (0, 2) (2, 4) (4, 5) dijkstra run result : vertex 0 is selected with parent -1, and distance from vertext 0 is 0 vertex 1 is selected with parent 2, and distance from vertext 0 is 13 vertex 2 is selected with parent 0, and distance from vertext 0 is 9 vertex 3 is selected with parent 1, and distance from vertext 0 is 25 vertex 4 is selected with parent 2, and distance from vertext 0 is 19 vertex 5 is selected with parent 3, and distance from vertext 0 is 45 the shortest path from 0 to 5 is like following (0, 2) (2, 1) (1, 3) (3, 5) dijkstra run result : vertex 0 is selected with parent -1, and distance from vertext 0 is 0 vertex 1 is selected with parent 0, and distance from vertext 0 is 16 vertex 2 is selected with parent 0, and distance from vertext 0 is 5 vertex 3 is selected with parent 4, and distance from vertext 0 is 22 vertex 4 is selected with parent 2, and distance from vertext 0 is 15 vertex 5 is selected with parent 3, and distance from vertext 0 is 38 the shortest path from 0 to 5 is like following (0, 2) (2, 4) (4, 3) (3, 5) dijkstra run result : vertex 0 is selected with parent -1, and distance from vertext 0 is 0 vertex 1 is selected with parent 0, and distance from vertext 0 is 16 vertex 2 is selected with parent 1, and distance from vertext 0 is 26 vertex 3 is selected with parent 1, and distance from vertext 0 is 24 vertex 4 is selected with parent 2, and distance from vertext 0 is 31 vertex 5 is selected with parent 3, and distance from vertext 0 is 35 the shortest path from 0 to 5 is like following (0, 1) (1, 3) (3, 5) dijkstra run result : vertex 0 is selected with parent -1, and distance from vertext 0 is 0 vertex 1 is selected with parent 0, and distance from vertext 0 is 8 vertex 2 is selected with parent 1, and distance from vertext 0 is 18 vertex 3 is selected with parent 4, and distance from vertext 0 is 25 vertex 4 is selected with parent 2, and distance from vertext 0 is 23 vertex 5 is selected with parent 3, and distance from vertext 0 is 28 the shortest path from 0 to 5 is like following (0, 1) (1, 2) (2, 4) (4, 3) (3, 5) dijkstra run result : vertex 0 is selected with parent -1, and distance from vertext 0 is 0 vertex 1 is selected with parent 0, and distance from vertext 0 is 6 vertex 2 is selected with parent 1, and distance from vertext 0 is 14 vertex 3 is selected with parent -1, and distance from vertext 0 is 2147483647 vertex 4 is selected with parent 2, and distance from vertext 0 is 17 vertex 5 is selected with parent -1, and distance from vertext 0 is 2147483647 max flow from source 0 to sink 5 is 23