У меня проблема с кратчайшим путем в ориентированном взвешенном графе. Я знаю Dijkstra
, BFS
, DFS
. Однако у меня есть a set of vertices S
для отправных точек и a set of vertices E to end
. S и E не пересекаются. Итак, как я могу найти набор ребер с минимальной суммой веса ребер? Набор ребер не обязательно должен включать все вершины в S, но должен reach all vertices in E
. Должен ли я начать с Дейкстры для всех перестановок {Si, Ei} и оптимизировать, или я пропущу какой-либо важный алгоритм, который я должен знать? Или даже я слишком много думаю....
Набор кратчайших путей с несколькими начальными и множественными концами
comment
Добавьте две вершины, начальную, соединенную со всеми вершинами в S, и конечную, соединенную со всеми вершинами в E. Запустите Dijkstra на новом графике.
- person user58697   schedule 01.05.2014
comment
однако кратчайший путь (множество) достигнет End, но не обязательно достигнет всех вершин в E.
- person ZhijieWang   schedule 01.05.2014
comment
Если путь от начала до конца является кратчайшим, он является кратчайшим среди всех путей от {S} до {E}. Если я полностью неправильно понял вопрос.
- person user58697   schedule 01.05.2014
comment
Предположим, что в наборе E есть E1 и E2. Вы можете достичь End через E1 и полностью пропустить E2.
- person ZhijieWang   schedule 01.05.2014
Ответы (1)
Если я вас правильно понял, вы хотите найти дерево минимального веса в графе, содержащем все вершины E и хотя бы одну вершину из S.
Задача называется общее дерево Штейнера и является NP-сложной. Так что лучшее, на что вы можете надеяться, это алгоритм с экспоненциальным временем или какое-то приближение (минимальное остовное дерево всего графа приходит на ум, возможно, после удаления некоторых ненужных поддеревьев).
Существует простое решение DP, которое работает за O (2 ^ n * (n + m)): пусть f (S) будет стоимостью минимального дерева в графе, которое охватывает все узлы в S. Можно показать, что существует такое дерево T, что вес T \ {x} равен f(S \ {x}) для некоторого x, поэтому переход можно выполнить за O(n + m).
person
Niklas B.
schedule
01.05.2014
@user1505108 user1505108 Ну, тогда это не совсем очевидно, но проблема сложная.
- person Niklas B.; 01.05.2014
@ user1505108 Я добавил алгоритм DP O (2 ^ n * (n + m)) , если это полезно. По крайней мере, это не зависит экспоненциально от количества ребер.
- person Niklas B.; 01.05.2014