Advertisement
Infidelis

graph_theory_task2

Nov 1st, 2019
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.96 KB | None | 0 0
  1. Мамедов Валентин Юрьевич
  2. Группа 17123
  3. ---------
  4. Задание: Алгоритм Тарьяна
  5. Выявление блоков/компонент двусвязности графа
  6. =========
  7. Краткое описание кода
  8. =========
  9. На вход сначала подается число n - количество вершин в исходном графе.
  10. Далее вводится матрица смежности графа.
  11.  
  12. На выходе: блоки компонент двусвязноси графа.
  13.  
  14. Просмотр кода на Pastebin: https://pastebin.com/v52umRHQ
  15. Тесты программы: https://pastebin.com/ErPJfFd5
  16. ========
  17. Мотивация
  18. ========
  19. Дан неориентированный граф.
  20.  
  21. Двусвязные компоненты - максимальные подграфы, такие что при удалении узла, подграф не будет распадаться на части. Эти узлы называются точками сочленения.
  22.  
  23. Кликой неориентированного графа называется подмножество его вершин, любые две из которых соединены ребром.
  24.  
  25. Блоковый граф — вид неориентированного графа, в котором каждая компонента двусвязности (блок) является кликой.
  26.  
  27. Таким образом нам нужно найти количество блоков у неориентированного графа.
  28.  
  29. Для решения этой задачи используем алгоритм Тарьяна, у которого сложность O(n).
  30. ========
  31. Описание алгоритма
  32. ========
  33. Заднее ребро: это ребро (u, v), такое, что v является предком ребра u, но не является частью дерева DFS.
  34.  
  35. Поиск компонент реализованы с использованием нерекурсивного поиска в глубину. При посещении вершины она проталкивается во вспомогательный стек, а выталкивается при окончании обработки.
  36.  
  37. Узел n является точкой сочленения, тогда и только тогда, когда существует поддерево с корнем в n, такое что нет заднего ребра до любого предка n, который ссылается на n в дереве DFS. Отслеживая все пройденные ребра с помощью DFS мы можем получить двусвязные компоненты, потому что все ребра двусвязного графа будут проходить последовательно между точками сочленения.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement