Я изучаю кратчайшие пути в ориентированных графах в настоящее время. Существует много эффективных алгоритмов для поиска кратчайшего пути в сети, например, dijkstra или bellman-ford. Но что, если график является динамическим? Говоря динамически, я имею в виду, что мы можем вставлять или удалять вершины во время выполнения программы. Я пытаюсь найти эффективный алгоритм для обновления кратчайших путей от вершины до любой другой вершины после вставки ребра без необходимости повторного запуска алгоритма кратчайшего пути в новом графе. Как я могу это сделать? Заранее спасибо.
- Примечание: изменения могут быть сделаны после первой итерации алгоритма
- Примечание [2]: два узла приведен, источник и цели. Мне нужно найти кратчайший путь между этими узлами. Когда график обновляется, мне нужно только обновить , который является кратчайшим путем между и .
- Примечание [3]: меня интересует только случай вставки края.
Формальное определение : Дан граф . Определим операцию обновления , как 1) вставку кромки к или 2) аа удаление краевой из . Цель состоит в том, чтобы эффективно найти стоимость всех пар кратчайших путей после операции обновления. Под эффективностью мы подразумеваем как минимум лучшее, чем выполнение алгоритма All-Pairs-Shortest-Path, такого как алгоритм Беллмана-Форда, после каждой операции обновления.e E e E
Редактировать: Ниже приведена упрощенная версия задачи:
Дан взвешенный граф , состоящий из однонаправленных ребер и двух критических вершин и . Набор кандидатов двунаправленных ребер также дается. Я должен построить ребро чтобы минимизировать расстояние от до .s t Cs t