diff --git a/README.md b/README.md index 79223cc..fe61d55 100644 --- a/README.md +++ b/README.md @@ -217,3 +217,4 @@ Fork this project and add your username + profile link to the [Census](https://g - [Deepanshu Dabas](https://github.com/deepanshu22) - [Soubhik Rakshit](https://github.com/soubh1k) - [Jasen Wyatt](https://github.com/jasenwyatt) + - [Dev Goyal](https://github.com/devgoyal04) diff --git a/algorithms/floyd_warshall.cpp b/algorithms/floyd_warshall.cpp new file mode 100644 index 0000000..6d85357 --- /dev/null +++ b/algorithms/floyd_warshall.cpp @@ -0,0 +1,105 @@ +// C++ Program for Floyd Warshall Algorithm +#include +using namespace std; + +// Number of vertices in the graph +#define V 4 + +/* Define Infinite as a large enough +value.This value will be used for +vertices not connected to each other */ +#define INF 99999 + +// A function to print the solution matrix +void printSolution(int dist[][V]); + +// Solves the all-pairs shortest path +// problem using Floyd Warshall algorithm +void floydWarshall (int graph[][V]) +{ + /* dist[][] will be the output matrix + that will finally have the shortest + distances between every pair of vertices */ + int dist[V][V], i, j, k; + + /* Initialize the solution matrix same + as input graph matrix. Or we can say + the initial values of shortest distances + are based on shortest paths considering + no intermediate vertex. */ + for (i = 0; i < V; i++) + for (j = 0; j < V; j++) + dist[i][j] = graph[i][j]; + + /* Add all vertices one by one to + the set of intermediate vertices. + ---> Before start of an iteration, + we have shortest distances between all + pairs of vertices such that the + shortest distances consider only the + vertices in set {0, 1, 2, .. k-1} as + intermediate vertices. + ----> After the end of an iteration, + vertex no. k is added to the set of + intermediate vertices and the set becomes {0, 1, 2, .. k} */ + for (k = 0; k < V; k++) + { + // Pick all vertices as source one by one + for (i = 0; i < V; i++) + { + // Pick all vertices as destination for the + // above picked source + for (j = 0; j < V; j++) + { + // If vertex k is on the shortest path from + // i to j, then update the value of dist[i][j] + if (dist[i][k] + dist[k][j] < dist[i][j]) + dist[i][j] = dist[i][k] + dist[k][j]; + } + } + } + + // Print the shortest distance matrix + printSolution(dist); +} + +/* A utility function to print solution */ +void printSolution(int dist[][V]) +{ + cout<<"The following matrix shows the shortest distances" + " between every pair of vertices \n"; + for (int i = 0; i < V; i++) + { + for (int j = 0; j < V; j++) + { + if (dist[i][j] == INF) + cout<<"INF"<<" "; + else + cout<(3) + | /|\ + 5 | | + | | 1 + \|/ | + (1)------->(2) + 3 */ + int graph[V][V] = { {0, 5, INF, 10}, + {INF, 0, 3, INF}, + {INF, INF, 0, 1}, + {INF, INF, INF, 0} + }; + + // Print the solution + floydWarshall(graph); + return 0; +}