Find shortest distances between every pair of vertices in a given edge weighted directed Graph.
Input:
The first line of input contains an integer T denoting the no of test cases . Then T test cases follow . The first line of each test case contains an integer V denoting the size of the adjacency matrix and in the next line are V*V space separated values of the matrix (graph) .
Output:
For each test case output will be V*V space separated integers where the i-jth integer denote the shortest distance of ith vertex from jth vertex.
Constraints:
1<=T<=20
1<=V<=20
-1000<=graph[][]<=1000
Example:
Input
2
2
0 25 25 0
3
0 1 43 1 0 6 43 6 0
Output
0 25 25 0
0 1 7 1 0 6 7 6 0
Explanation : –
To Find shortest distances between every pair of vertices We first initialize the solution matrix same as the input graph matrix as a first step. Then we update the solution matrix by considering all vertices as an intermediate vertex. The idea is to one by one pick all vertices and update all shortest paths which include the picked vertex as an intermediate vertex in the shortest path. When we pick vertex number k as an intermediate vertex, we already have considered vertices {0, 1, 2, .. k-1} as intermediate vertices. For every pair (i, j) of source and destination vertices respectively, there are two possible cases.
All steps are explained in below images.
1) k is not an intermediate vertex in shortest path from i to j. We keep the value of dist[i][j] as it is.
2) k is an intermediate vertex in shortest path from i to j. We update the value of dist[i][j] as dist[i][k] + dist[k][j].
Code(C++) To Find shortest distances between every pair of vertices : –
#include <stdio.h> #define ll long long using namespace std; int main() { ll t; cin >> t; while (t--) { ll m; cin >> m; ll dist[m][m]; for (ll i = 0; i < m; i++) for (ll j = 0; j > dist[i][j]; for (ll k = 0; k < m; k++) for (ll i = 0; i < m; i++) for (ll j = 0; j < m; j++) { if (dist[i][k] + dist[k][j] < dist[i][j]) dist[i][j] = dist[i][k] + dist[k][j]; } for (ll i = 0; i < m; i++) for (ll j = 0; j < m; j++) cout << dist[i][j] << " "; cout << "\n"; } return 0; }