Нахождение сильно связных компонентов в графе (python)
Меня попросили написать маленькую программу по нахождению сильно связных компонентов. И так как я на данный момент изучаю python, то решил реализовать эту программу именно на этом (на мой взгляд афигенном языке!!!).
Задача заключалась в следующем: Вершины графа и ребра, которые соединяют их вводятся в файл (допустим input), а на выход в файл (как Вы уже поняли out) записываются все сильно связные компоненты этого графа.
Примерно так:
2 5 6 - то есть из вершины 2 идет ребро к вершинам 5 и 6
4 4 5 - из вершины 4 идет только одно ребро к вершине 5, так как ребра от вершины 4 к самой вершине 4 нам ненужно. Так что можно было и написать 4 5. Но это нам погоду не меняет.
Этак немного WIKI - для самообразования:
Компонента сильной связности в орграфе
Орграф называется сильно связным (англ. strongly connected), если любые две его вершины сильно связаны. Две вершины s и t любого графа сильно связаны, если существует ориентированный путь из s в t и ориентированный путь из t в s. Компонентами сильной связности орграфа называются его максимальные по включению сильно связные подграфы.
Алгоритмы
Простейший алгоритм решения задачи о поиске сильно связных компонент в орграфе работает следующим образом:- При помощи транзитивного замыкания проверяем, достижима ли t из s, и s из t, для всех пар s и t.
- Затем определяем такой неориентированный граф, в котором для каждой такой пары содержится ребро.
- Поиск компонент связности такого неориентированного графа даст нам компоненты сильной связности нашего орграфа.
Также существует три алгоритма, решающих данную задачу за линейное время, то есть в V раз быстрее, чем приведенный выше алгоритм. Это алгоритмы Косарайю, Габова и Тарьяна.
Комментарии
Отправить комментарий