2013-12-25 5 views
2

Учитывая неориентированный граф G = (V, E), V1, V2 являются подмножествами V. d(V1,V2)=min d(v1,v2),
так что мне нужно, чтобы выяснить, как найти D (V1, V2), в O(|V|+|E|)нахождения miniums расстояние между двумя подмножествами вершин

, если enter image description here затем d(V1,V2)=0

в противном случае, я случайно выбрать v1' от V1 и запустить BFS (V1, v1 '), за исключением самой дальней вершины из v1' на v1 '' буду сделать то же для некоторой случайной вершины v2 'из V2. return d (V1, V2) = min {d (v1 ', v2'), d (v1 ', v2' '), d (v1''v2'), d (v1 '', v2 '')}

будет ли это работать? поскольку время выполнения BFS является O (| V | + | E |) предложенный алгоритм будет работать в O (| V | + | E |)

+0

Нет, не будет. Рассмотрим случай, когда оба ваших начальных узла и конечные узлы - это просто не пара узлов с расстоянием 1 на вашем графике. – LumpN

+0

Учитываются ли края? –

+0

@AlexandruBarbarosie no –

ответ

5

IMO, что вы можете сделать, это выглядит следующим образом:

  1. Сканируйте набор V1 и отметьте все ребра, которые начинаются в узлах в V1 и заканчиваются в узлах, не входящих в V1.
  2. Теперь объедините все узлы в V1 в один узел. Края, отмеченные на шаге 1, должны быть краями, выходящими из этого узла.
  3. Сделайте то же самое для V2.
  4. Теперь он сводится к кратчайшей проблеме маршрута между узлами V1 и V2. Это можно решить, проведя простую BFS на узле V1 или V2 в O (E), где E - число ребер в графе.
+0

Я думаю, что это достаточно хорошо, если вы достаточно осторожны, он будет запускать 'O (M)', где 'M' - количество ребер на графике. Однако вам не нужен алгоритм Дейкстры. Обычная BFS будет делать, поскольку график не взвешен (кроме того, Dijkstra увеличивает сложность). –

+0

@BorisStrandjev Да, спасибо. Обновлен мой ответ. –

+0

Нужно еще одно редактирование - DFS не подходит для поиска кратчайшего маршрута между двумя вершинами в случайном графе. –

Смежные вопросы