add Floyd -Warshall algorithm to PR
parent
c64c4d1f66
commit
15409f222e
|
@ -0,0 +1,101 @@
|
|||
# Python implementation of Floyd Warshall Algorithm for solving "all pairs"
|
||||
# shortest path problems in a graph. The algorithm finds the shortest path
|
||||
# in a weighted digraph with positive or negative edge weights (but no negative
|
||||
# cycles). Although it does not return details of the paths themselves, it
|
||||
# is possible to reconstruct the paths with simple modifications of to the algorithm.
|
||||
# Versions of the program can also be used for finding the "transitive closure" of
|
||||
# a relation R, or widest paths between all pairs of vertices in a weighted graph.
|
||||
# Floyd-Warshall is an example of dynamic programming. The time complexity is
|
||||
# O(V^3) even though there may be O(V^2) edges in the graph.
|
||||
|
||||
# Number of vertices in the graph
|
||||
V = 4
|
||||
|
||||
# Define infinity to be a large
|
||||
# enough integer value. This value will be
|
||||
# used for vertices not connected to each other
|
||||
INF = 99999
|
||||
|
||||
# Solves all pairs shortest path
|
||||
# via Floyd Warshall Algorithm
|
||||
|
||||
|
||||
def floydWarshall(graph):
|
||||
""" dist[][] will be the output
|
||||
matrix that will finally
|
||||
have the shortest distances
|
||||
between every pair of vertices """
|
||||
""" initializing the solution matrix
|
||||
same as input graph matrix
|
||||
OR we can say that the initial
|
||||
values of shortest distances
|
||||
are based on shortest paths considering no
|
||||
intermediate vertices """
|
||||
|
||||
dist = list(map(lambda i: list(map(lambda j: j, i)), graph))
|
||||
|
||||
""" 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 the set
|
||||
{0, 1, 2, .. k-1} as intermediate vertices.
|
||||
----> After the end of a
|
||||
iteration, vertex no. k is
|
||||
added to the set of intermediate
|
||||
vertices and the
|
||||
set becomes {0, 1, 2, .. k}
|
||||
"""
|
||||
for k in range(V):
|
||||
|
||||
# pick all vertices as source one by one
|
||||
for i in range(V):
|
||||
|
||||
# Pick all vertices as destination for the
|
||||
# above picked source
|
||||
for j in range(V):
|
||||
|
||||
# If vertex k is on the shortest path from
|
||||
# i to j, then update the value of dist[i][j]
|
||||
dist[i][j] = min(dist[i][j],
|
||||
dist[i][k] + dist[k][j]
|
||||
)
|
||||
printSolution(dist)
|
||||
|
||||
|
||||
# A utility function to print the solution
|
||||
def printSolution(dist):
|
||||
print("The Following matrix shows the shortest distances between every pair of vertices")
|
||||
for i in range(V):
|
||||
for j in range(V):
|
||||
if(dist[i][j] == INF):
|
||||
print("%7s" % ("INF"), end=" ")
|
||||
else:
|
||||
print("%5d\t" % (dist[i][j]), end=' ')
|
||||
if j == V-1:
|
||||
print()
|
||||
|
||||
|
||||
# Driver's code
|
||||
if __name__ == "__main__":
|
||||
"""
|
||||
10
|
||||
(0)------->(3)
|
||||
| /|\
|
||||
5 | |
|
||||
| | 1
|
||||
\|/ |
|
||||
(1)------->(2)
|
||||
3 """
|
||||
graph = [[0, 5, INF, 10],
|
||||
[INF, 0, 3, INF],
|
||||
[INF, INF, 0, 1],
|
||||
[INF, INF, INF, 0]
|
||||
]
|
||||
# Function call
|
||||
floydWarshall(graph)
|
||||
|
Loading…
Reference in New Issue