Floyd’s algorithm uses dynamic programming to calculate the shortest path between every pair of nodes simultaneously. We start with an adjacency list adj
, containing all weights between all nodes, or inf if there is no edge between 2 nodes.
dist ← adj
for k from 1 to |dist|
for i from 1 to |dist|
for j from 1 to |dist|
if dist[i][j] > dist[i][k] + dist[k][j]
dist[i][j] ← dist[i][k] + dist[k][j]
end if
Implement this algorithm. The algorithm will need some extensions to allow the reconstruction of the path.
Write three Python functions:
floyd(adj: str)
returns the full calculated matrix.floyddist(adj: str, source: int, sink: int)
returns the shortest distance between source
and sink
.floydpath(adj: str, source: int, sink: int)
returns the shortest path between source
and sink
. If there are multiple shortest paths, return the path with the fewest nodes.These functions all receive a string containing an adjacency matrix as input.
"
- 4 - -
3 - 7 4
- - - 1
5 6 7 -
"
represents an adjacency matrix, corresponding to the weighted adjacency list below:
0:[(4,1)],
1:[(3,0),(7,2),(4,3)],
2:[(1,3)],
3:[(5,0),(6,1),(7,2)]
and corresponding to the graph below:
>>> floyd(open("graaf.in").read())
[[7, 4, 11, 8], [3, 7, 7, 4], [6, 7, 8, 1], [5, 6, 7, 8]]
>>> floyddist(open("graaf.in").read())
8
>>> floydpath(open("graaf.in").read())
[0, 1, 3]
For all doctests, graaf.in1 should be in the current directory.