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

Как мне получить каждый кратчайший путь от вершины 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];
}

Можете добавить реализацию метода copy?

Jacob G. 17.04.2018 19:32

Я только что добавил функцию копирования.

Tuan Pham 17.04.2018 19:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
304
1

Ответы 1

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

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

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

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

Спасибо за ответ. Я запрограммирую его и вернусь, если у меня возникнут проблемы

Tuan Pham 17.04.2018 23:34

Другие вопросы по теме