I'm trying to reconstruct the least cost path between two vertices from a Floyd-Warshall algorithm I implemented in Lua.
Here is what i've written so far:
function shallow_copy(g)
local h = {}
for k, v in pairs(g) do
h[k] = v
end
return h
end
function fw(g) -- g is an adjacency matrix representing the graph
local d = shaloow_copy(g)
for k = 1, #d do
for i = 1, #d do
for j = 1, #d do
d[i][j] = math.min(d[i][j], d[i][k] + d[k][j])
end
end
end
return d
end
These functions give me a matrix containing the length (number of edges) separating each pair of vertices in my graph g, which is great.
I now need to know the actual path between any given vertices. Wikipedia conveniently provides pseudo code, but -being a newbie- I'm confuse about how to implement it.
Here is the pseudocode provided in the wikipedia article (https://en.wikipedia.org/wiki/Floyd–Warshall_algorithm#Path_reconstruction):
let dist be a |V| × |V| array of minimum distances initialized to ∞ (infinity)
let next be a |V| × |V| array of vertex indices initialized to null
procedure FloydWarshallWithPathReconstruction ()
for each vertex v
dist[v][v] ← 0
for each edge (u,v)
dist[u][v] ← w(u,v) // the weight of the edge (u,v)
for k from 1 to |V|
for i from 1 to |V|
for j from 1 to |V|
if dist[i][k] + dist[k][j] < dist[i][j] then
dist[i][j] ← dist[i][k] + dist[k][j]
next[i][j] ← k
function Path (i, j)
if dist[i][j] = ∞ then
return "no path"
var intermediate ← next[i][j]
if intermediate = null then
return " " // the direct edge from i to j gives the shortest path
else
return Path(i, intermediate) + intermediate + Path(intermediate, j)
Would anyone know how to implement this pseudo code in lua? Do I need to re-write my short piece of lua code or can this pseudocode be somehow merged into what I've got?
Cheers!