Представление вашего графа в основном представляет собой список смежности, для каждой вершины v= G[i][j]
у вас есть список, содержащий ребра граф связан с. В вашем случае список состоит из 4 логических значений - каждое указывает, подключен ли (i,j)
к (i-1,j),(i+1,j),(i,j-1),(i,j+1)
, поэтому использование алгоритма Флойда-Уоршалла с таким пониманием довольно просто, если смотреть на псевдокод википедии:
1 let dist be a |V| × |V| array of minimum distances initialized to ∞ (infinity)
2 for each vertex v
3 dist[v][v] ← 0
4 for each edge (u,v)
5 dist[u][v] ← w(u,v) // the weight of the edge (u,v)
6 for k from 1 to |V|
7 for i from 1 to |V|
8 for j from 1 to |V|
9 if dist[i][j] > dist[i][k] + dist[k][j]
10 dist[i][j] ← dist[i][k] + dist[k][j]
11 end if
Основное различие в строках 4-5, где:
for each edge(u,v):
на самом деле
for each x=0,1,...,n-1
for each y=0,1,...,m-1
for each i=0,1,2,3:
//if G[x][y][y] == 1 : it's an edge
Также обратите внимание, что в вашем графике максимальный фактор ветвления (количество ребер, соединенных с узлом) равен 4. Это означает, что максимальное количество ребер в графе равно |E| <= 4|V|
.
Поскольку ваш график не является направленным, поиск кратчайшего пути от всех ко всем можно сделать более эффективно, выполнив BFS от каждого узла, это займет O(|V|*(|E|+|V|))
времени, но с |E| <= 4|V|
это O(|V|^2)
- по сравнению с Floyd-Warshall, который работает в O(|V|^3)
.
person
amit
schedule
02.07.2015