Which algorithm can I use to find the next to shortest path in a graph?

RadScriptManager отличается, чем Ajax MS scriptmanager, потому что он имеет EnableScriptCombine = "истинное" свойство, которое можно установить, который позволяет всем файлам JavaScript, используемым средствами управления telerik быть объединенными в один .js файл для улучшения производительности.

Первоначально редактор рада работал довольно медленный. Но последняя версия намного быстрее. Плюс у них есть оплачиваемый персонал, который постоянно работает для улучшения их средств управления.

я не знаю ни о чем, что близко подходит к RadGrid. Это довольно мощно. Я использую его прямо сейчас на приложении интранет, и это работает быстро до сих пор. Я использую все его функции, Группа By, Экспорт в Excel, и т.д.

Тем не менее, если бы я создавал интернет-приложение для наружного применения, то я использовал бы JQuery по telerik. Тем путем Вы имеете больше контроля.

16
задан Vimal Basdeo 13 February 2011 в 05:48
поделиться

2 ответа

Предполагается, что вы можете повторно использовать ребра и узлы:

Прямое решение - сделать расширение алгоритма Джикстры.

  • Вместо того, чтобы хранить для каждого узла наименьшую стоимость и его соответствующего родителя, сохраните две наименьшие затраты (и их соответствующих родителей).

  • Для очереди приоритетов, для хранения узлов, сохраните пары (node, i), чтобы вы знали, использовать ли 1-й или 2-й путь во время распространения.

  • Будьте внимательны во время фаз распространения, чтобы правильно обновлять значения нескольких путей.

(Я мог бы упустить некоторые важные детали, но основная идея здесь ...)

3
ответ дан 30 November 2019 в 16:29
поделиться

Вы ищете k маршрутизации по кратчайшему пути . По сути, запустите модифицированную Dijkstra, но вместо сохранения ребер в мини-куче сохраните все найденные пути.

Я предпочитаю рабочий код, так как дьявол всегда в деталях:

@SuppressWarnings("unchecked")
public static Iterable<Integer>[] kShortestPaths(EdgeWeightedDigraph g, int s, int t, int k) {
    if (k <= 0) throw new IllegalArgumentException("k must be positive");

    boolean[] visited = new boolean[g.V()];
    int[] count = new int[g.V()];
    MinPQ<Map.Entry<Map.Entry<Integer, Double>, Queue<Integer>>> heap = new MinPQ<>(
            comparingDouble(e -> e.getKey().getValue())
    );
    Queue<Integer>[] p = (Queue<Integer>[]) new Queue<?>[k];

    heap.insert(new SimpleImmutableEntry<>(new SimpleImmutableEntry<>(s, 0.0d), new Queue<>()));

    int i = 0;
    while (!heap.isEmpty()) {
        Map.Entry<Map.Entry<Integer, Double>, Queue<Integer>> node = heap.delMin();
        Integer u = node.getKey().getKey();
        if (count[u] >= k) break;

        Queue<Integer> pathU = node.getValue();
        visited[u] = true;
        pathU.enqueue(u);

        if (u == t) {
            p[i] = new Queue<>();
            for (int w : pathU) {
                p[i].enqueue(w);
            }
            i++;
        }

        if (count[u]++ <= k) {
            double costU = node.getKey().getValue();
            for (DirectedEdge e : g.adj(u)) {
                int v = e.to();
                if (!visited[v]) {
                    Queue<Integer> pathV = new Queue<>();
                    for (int w : pathU) {
                        pathV.enqueue(w);
                    }
                    heap.insert(new SimpleImmutableEntry<>(new SimpleImmutableEntry<>(v, e.weight() + costU), pathV));
                }
            }
        }
    }
    return p;
}

EdgeWeightedDigraph и MinPQ из https://github.com/kevin-wayne/algs4 .

enter image description here

k = 1, p = [0, 1, 2, 3]

k = 2, p = [0 , 4, 5, 3]

0
ответ дан 30 November 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: