Флойд Уоршалл: вычисление топ-k кратчайших путей на пару вершин

В алгоритме Флойда-Уоршалла стоимость кратчайшего пути вычисляется для любой пары вершин. Дополнительная бухгалтерия позволяет нам вести фактический путь (список вершин) на кратчайшем пути.

Как я могу расширить Флойда-Уоршалла так, чтобы для любой пары вершин находились K кратчайших топ-K кратчайших путей? Например, для K = 3 результатом будет то, что 3 кратчайших пути вычисляются и поддерживаются?

Я использовал реализацию Java от Sedgewick.


person stackoverflowuser2010    schedule 22.08.2014    source источник
comment
Вы имеете в виду K разные пути одинаковой минимальной длины или K пути разной длины, но короче любого другого пути?   -  person Codor    schedule 23.08.2014
comment
Я имел в виду второе.   -  person stackoverflowuser2010    schedule 23.08.2014
comment
Я возвращаюсь к сказанному ранее: Floyd - Warshall не является подходящей базой для этого. Структура динамического программирования F - W делает более или менее невозможным эффективное обнаружение повторяющихся путей.   -  person David Eisenstat    schedule 06.09.2014
comment
@DavidEisenstat: Можете ли вы порекомендовать другой алгоритм в качестве основы? Я все еще хочу решить кратчайший путь для всех пар с топ-k маршрутами на пару конечных точек.   -  person stackoverflowuser2010    schedule 06.09.2014
comment
en.wikipedia.org/wiki/K_shortest_path_routing?   -  person David Eisenstat    schedule 06.09.2014


Ответы (2)


Похоже, что Дейкстру было бы проще изменить для возврата N кратчайших путей. Поиску разрешается входить в вершину до тех пор, пока в вершину не войдут K кратчайших альтернатив.

Дополнительную информацию можно найти в статье в Википедии

person Pauli Nieminen    schedule 23.08.2014
comment
Не уверен, что это требование (вопрос не уточнял), но алгоритм Дейкстры не может обрабатывать отрицательные веса ребер. - person RishiG; 11.09.2014

Вы можете вызывать цикл несколько раз, используя дополнительное условие, которое может понравиться

for (int i = 0; i < V; i++) { // compute shortest paths using only 0, 1, ..., i as intermediate vertices for (int v = 0; v < V; v++) { if (edgeTo[v][i] == null) continue; // optimization for (int w = 0; w < V; w++) { if (distTo[v][w] > distTo[v][i] + distTo[i][w] && distTo[v][i]+distTo[i][w]>min[k]) { //min[k] is the minimum distance calculated in kth iteration of minimum distance calculation distTo[v][w] = distTo[v][i] + distTo[i][w]; edgeTo[v][w] = edgeTo[i][w]; } } // check for negative cycle if (distTo[v][v] < 0.0) { hasNegativeCycle = true; return; } } } Этот код вычислит K минимальных расстояний, которые различаются. Надеюсь, это поможет тебе.

person Zeshan Khan    schedule 06.09.2014