Алгоритм Флойда-Уоршалла возвращает каждый кратчайший путь с одинаковым весом.

Как мне получить каждый кратчайший путь от вершины 1 к вершине 10, имеющий одинаковый вес, с помощью алгоритма Флойда-Уоршалла? Мне удалось получить общее количество всех кратчайших путей от вершины 1 до вершины 10.

public static int[][] shortestpath(int[][] adj, int[][] path, int[][] count) {

    int n = adj.length;
    int[][] ans = new int[n][n];

    copy(ans, adj);

    // Compute incremently better paths through vertex k.
    for (int k = 0; k < n; k++) {

        // Iterate through each possible pair of points.
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {

                // Check if it is better to go through k as an intermediate vertex.
                if (ans[i][k] + ans[k][j] < ans[i][j]) {
                    ans[i][j] = ans[i][k] + ans[k][j];
                    path[i][j] = path[k][j];
                    count[i][j] = count[i][k]*count[k][j];
                } else if ((ans[i][j] == ans[i][k]+ans[k][j]) && (k!=j) && (k!=i)) {
                    count[i][j] += count[i][k]*count[k][j];
                }
            }
        }
    }

    // Return the shortest path matrix.
    return ans;
}

public static void copy(int[][] a, int[][] b) {
    for (int i = 0; i < a.length; i++)
        for (int j = 0; j < a[0].length; j++)
            a[i][j] = b[i][j];
}

person Tuan Pham    schedule 17.04.2018    source источник
comment
Можете добавить реализацию метода copy?   -  person Jacob G.    schedule 17.04.2018
comment
Я только что добавил функцию копирования.   -  person Tuan Pham    schedule 17.04.2018


Ответы (1)


Используйте алгоритм один раз, чтобы найти взвешенную длину для каждой вершины кратчайшего пути из v1.

Снова используйте алгоритм, чтобы найти взвешенную длину для каждой вершины кратчайшего пути к v10.

Все вершины, находящиеся на кратчайшем пути, будут иметь сумму этих двух взвешенных длин, равную взвешенной длине от v1 до v10. Направленное ребро находится на кратчайшем пути, если и только обе вершины находятся на кратчайшем пути, а вес исходного ребра равен разнице взвешенной длины с v1.

Это даст вам направленный подграф всего на кратчайших путях, при этом большая часть затрат приходится на два прогона базового алгоритма. Вы можете перечислить его рекурсивно. Имейте в виду, что кратчайших путей может быть много, и поэтому выполнение самого перечисления может занять экспоненциально много времени.

person btilly    schedule 17.04.2018
comment
Спасибо за ответ. Я запрограммирую и вернусь, если у меня возникнут проблемы - person Tuan Pham; 18.04.2018