2020-05-29 23:23:24 +03:00
|
|
|
#include <limits.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
2017-10-12 18:34:57 +03:00
|
|
|
|
2020-05-29 23:23:24 +03:00
|
|
|
// Structure for storing a graph
|
|
|
|
struct Graph
|
|
|
|
{
|
|
|
|
int vertexNum;
|
|
|
|
int **edges;
|
2017-10-12 18:34:57 +03:00
|
|
|
};
|
|
|
|
|
2020-05-29 23:23:24 +03:00
|
|
|
// Constructs a graph with V vertices and E edges
|
|
|
|
void createGraph(struct Graph *G, int V)
|
|
|
|
{
|
|
|
|
G->vertexNum = V;
|
|
|
|
G->edges = (int **)malloc(V * sizeof(int *));
|
|
|
|
for (int i = 0; i < V; i++)
|
|
|
|
{
|
|
|
|
G->edges[i] = (int *)malloc(V * sizeof(int));
|
2020-06-28 18:25:37 +03:00
|
|
|
for (int j = 0; j < V; j++) G->edges[i][j] = INT_MAX;
|
2020-05-29 23:23:24 +03:00
|
|
|
G->edges[i][i] = 0;
|
|
|
|
}
|
2017-10-12 18:34:57 +03:00
|
|
|
}
|
|
|
|
|
2020-05-29 23:23:24 +03:00
|
|
|
// Adds the given edge to the graph
|
|
|
|
void addEdge(struct Graph *G, int src, int dst, int weight)
|
|
|
|
{
|
|
|
|
G->edges[src][dst] = weight;
|
2017-10-12 18:34:57 +03:00
|
|
|
}
|
|
|
|
|
2020-05-29 23:23:24 +03:00
|
|
|
// Utility function to print distances
|
|
|
|
void print(int dist[], int V)
|
|
|
|
{
|
|
|
|
printf("\nThe Distance matrix for Floyd - Warshall\n");
|
|
|
|
for (int i = 0; i < V; i++)
|
|
|
|
{
|
|
|
|
for (int j = 0; j < V; j++)
|
|
|
|
{
|
|
|
|
if (dist[i * V + j] != INT_MAX)
|
|
|
|
printf("%d\t", dist[i * V + j]);
|
|
|
|
else
|
|
|
|
printf("INF\t");
|
|
|
|
}
|
|
|
|
printf("\n");
|
|
|
|
}
|
2017-10-12 18:34:57 +03:00
|
|
|
}
|
|
|
|
|
2020-05-29 23:23:24 +03:00
|
|
|
// The main function that finds the shortest path from a vertex
|
|
|
|
// to all other vertices using Floyd-Warshall Algorithm.
|
|
|
|
void FloydWarshall(struct Graph *graph)
|
|
|
|
{
|
|
|
|
int V = graph->vertexNum;
|
|
|
|
int dist[V][V];
|
|
|
|
|
|
|
|
// Initialise distance array
|
|
|
|
for (int i = 0; i < V; i++)
|
2020-06-28 18:25:37 +03:00
|
|
|
for (int j = 0; j < V; j++) dist[i][j] = graph->edges[i][j];
|
2017-10-12 18:34:57 +03:00
|
|
|
|
2020-05-29 23:23:24 +03:00
|
|
|
// Calculate distances
|
|
|
|
for (int k = 0; k < V; k++)
|
|
|
|
// Choose an intermediate vertex
|
2017-10-12 18:34:57 +03:00
|
|
|
|
2020-05-29 23:23:24 +03:00
|
|
|
for (int i = 0; i < V; i++)
|
|
|
|
// Choose a source vertex for given intermediate
|
2017-10-12 18:34:57 +03:00
|
|
|
|
2020-05-29 23:23:24 +03:00
|
|
|
for (int j = 0; j < V; j++)
|
|
|
|
// Choose a destination vertex for above source vertex
|
2017-10-12 18:34:57 +03:00
|
|
|
|
2020-05-29 23:23:24 +03:00
|
|
|
if (dist[i][k] != INT_MAX && dist[k][j] != INT_MAX &&
|
|
|
|
dist[i][k] + dist[k][j] < dist[i][j])
|
|
|
|
// If the distance through intermediate vertex is less than
|
|
|
|
// direct edge then update value in distance array
|
|
|
|
dist[i][j] = dist[i][k] + dist[k][j];
|
|
|
|
|
|
|
|
// Convert 2d array to 1d array for print
|
|
|
|
int dist1d[V * V];
|
|
|
|
for (int i = 0; i < V; i++)
|
2020-06-28 18:25:37 +03:00
|
|
|
for (int j = 0; j < V; j++) dist1d[i * V + j] = dist[i][j];
|
2020-05-29 23:23:24 +03:00
|
|
|
|
|
|
|
print(dist1d, V);
|
|
|
|
}
|
2017-10-12 18:34:57 +03:00
|
|
|
|
2020-05-29 23:23:24 +03:00
|
|
|
// Driver Function
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
int V, E;
|
|
|
|
int src, dst, weight;
|
|
|
|
struct Graph G;
|
|
|
|
printf("Enter number of vertices: ");
|
|
|
|
scanf("%d", &V);
|
|
|
|
printf("Enter number of edges: ");
|
|
|
|
scanf("%d", &E);
|
|
|
|
createGraph(&G, V);
|
|
|
|
for (int i = 0; i < E; i++)
|
|
|
|
{
|
|
|
|
printf("\nEdge %d \nEnter source: ", i + 1);
|
|
|
|
scanf("%d", &src);
|
|
|
|
printf("Enter destination: ");
|
|
|
|
scanf("%d", &dst);
|
|
|
|
printf("Enter weight: ");
|
|
|
|
scanf("%d", &weight);
|
|
|
|
addEdge(&G, src, dst, weight);
|
|
|
|
}
|
|
|
|
FloydWarshall(&G);
|
2017-10-12 18:34:57 +03:00
|
|
|
|
2020-05-29 23:23:24 +03:00
|
|
|
return 0;
|
2017-10-12 18:34:57 +03:00
|
|
|
}
|