Направленный граф G = (V, E) называется полусвязным, если для всех пар вершин u, v в V имеем u -> v или v -> u путь. Дайте эффективный алгоритм, чтобы определить, является ли G пол соединенныхОпределить, является ли граф полусвязным или нет
ответ
O(V^3)
Trivial решение могло бы использовать floyd warshal все к все кратчайший путь, но это излишнее (с точкой зрения сложности времени).
Это можно сделать в O(V+E)
.
претензия:
ДАГА пола соединено в топологической сортировке, для каждого i
, там есть ребро (vi,vi+1)
Доказательство:
Учитывая ДАГ с топологической сортировкой v1,v2,...,vn
:
Если нет края (vi,vi+1)
для некоторые i
, то также нет пути (vi+1,vi)
(потому что это топологический вид DAG), и граф не является полусвязным.
Если для каждого i
есть ребро (vi,vi+1)
, то для каждого i,j
(ivi- > Vi + 1- > > ...- VJ-1- > VJ, а граф полу подключен.
из этого мы можем получить алгоритм:.
- Найти Максимальный СОС в графе
- построить SCC граф G '= (U, E') таким образом, что
U
представляет собой набор SCCsE'= {(V1,V2) | there is v1 in V1 and v2 in V2 such that (v1,v2) is in E)
- Сделайте топологическую сортировку по G '
- Проверьте, существует ли для каждого i край Vi, Vi + 1.
Корректность доказательство:
Если граф является полу подключен, для пары (v1,v2)
, таким образом, что существует путь v1->...->v2
- Пусть V1, V2 быть их СОС. Существует путь от V1 до V2 и, следовательно, также от v1 до v2, поскольку все узлы в V1 и V2 сильно связаны.
Если алгоритм дал истинное значение, чем для любых двух заданных узлов v1, v2 - в SCC V1 и V2. Существует путь от V1 до V2 (без потери общности) и, следовательно, также от v1 до v2.
В качестве примечания, и каждый полу-связный граф имеет корень (вершина r
, что приводит ко всем вершинам):
Доказательство:
Предположим, что нет корня. Определить #(v) = |{u | there is a path from v to u}|
(количество узлов, у которых есть путь от v
к ним).
Выберите a
такой, что #(a) = max{#(v) | for all v}
. a
не является корнем, поэтому существует некоторый узел u
, у которого нет пути от a
. Поскольку граф полусвязан, это означает, что существует путь u->...->a
. Но это означает, что #(u) >= #(a) + 1
(все узлы достижимы от a
, а также u
).
Противоречие до максимальной величины #(a)
, при этом есть корень.
Soltuin Amit полностью описывает наиболее эффективный подход. Я могу просто добавить, что можно заменить шаг 4, проверяя, существует ли более одного топологического порядка G '. Если да, то график не является полусвязным. В противном случае граф полусвяз. Это можно легко включить в Kahn's algorithm для нахождения топологического порядка графика.
Другим менее эффективным решением, которое работает в квадратичное время, является следующее.
Сначала постройте еще один граф G *, который является обратным исходному графу. Затем для каждой вершины v из G вы запускаете DFS из v в G и рассматриваете множество достижимых узлов как R_v. Если R_v! = V (G), то запустите другую DFS из v в G * и пусть множество достижимых узлов будет R _v. Если объединение R_v и R _v не является V (G), то граф не является полусвязным.
- 1. проверить, является ли граф двудольным или нет
- 2. Как определить, является ли направленный граф циклическим?
- 3. Определение, является ли граф выпуклым
- 4. Измените метод DFS, чтобы он мог определить, является ли граф деревом или нет.
- 5. Как определить, является ли класс или объект одиночным или нет?
- 6. Определить, содержит ли граф треугольник?
- 7. Определить, является ли пользователь XMPP онлайн или нет
- 8. Как определить, является ли объект пустым или нет
- 9. Программа должна определить, является ли входной номер простым или нет.
- 10. как определить, является ли строка base64 или нет
- 11. определить, является ли строка стоп-слов или нет в питоне
- 12. Как определить, является ли браузер 64-разрядным или нет?
- 13. Как определить, является ли треугольная сетка вогнутой или нет?
- 14. Как определить, является ли CSV пустым или нет строк?
- 15. Код, чтобы определить, является ли строка Pangram или нет?
- 16. Быстро определить, является ли код Visual C++ или нет
- 17. Можно определить, является ли элемент html самозакрытым или нет?
- 18. Как определить, является ли ViewController верхним уровнем или нет?
- 19. Как определить, является ли mediacontroller видимым или нет?
- 20. Как определить, является ли URL-адрес изображением или нет?
- 21. Как определить, является ли число палиндром или нет в Java
- 22. Как определить, является ли поле первичным ключом или нет
- 23. Как определить, является ли TreeItem листом или нет?
- 24. Как определить, является ли msi временной отметкой или нет?
- 25. Невозможно определить, является ли перехватчик работает или нет в Struts2
- 26. Как определить, является ли приложение системным приложением или нет?
- 27. Как определить, является ли версия Windows законной или нет?
- 28. Как определить, является ли ответ динамического программирования оптимальным или нет?
- 29. Как определить, является ли элемент ввода html кнопкой или нет?
- 30. Как определить, является ли подсказка правильной или нет?
Спасибо за ответ. – Piyush
, если график цикличен? в этом случае для него нет топологической сортировки, но AFAICS он все еще может быть полусвязан. –
@PeriataBreatta Как говорится в ответе, сначала вы берете SCC (сильно подключенные компоненты) График SCC (как описано в 2) гарантированно является DAG. – amit