Циклические ориентированные и ненаправленные графы
Как обнаружить циклы в
- ориентированный граф
- неориентированный граф.
Для неориентированного графа... один из алгоритмов, о котором я подумал, - это использование непересекающихся множеств.
- для каждой вершины v в G
- Make-набор (v)
- для каждого ребра e(u,v) в G, взятого один за другим
- if Find-set (u) == Find-set (v)
- return true // Цикл присутствует
- if Find-set (u) == Find-set (v)
- вернуть ложь
2 ответа
Для ненаправленной, просто используйте DFS: если точка ребра к уже посещенной вершине, есть цикл.
Для направленного взглянуть на этот вопрос.
Ваш подход к поиску цикла в неориентированном графе должен быть таким:
- для каждой вершины v в G
- Meke-множество (v)
- для каждого ребра e(u,v) в G, взятого один за другим
- if Find-set(u) == Find-set(v)
- вернуть истину
- Союз-набор (U, V)
- if Find-set(u) == Find-set(v)
- вернуть ложь
Для ориентированного графа вы должны использовать алгоритм сильно связанных компонент Тарьяна, чтобы получить число сильно компонентных компонентов в графе. Затем вы можете проверить, равно ли число сильносвязанных компонентов числу вершин. Поскольку в ориентированном графе есть цикл, в одной и той же сильно связной компоненте есть как минимум две вершины. Это означает, что общее число сильно связанных компонентов должно быть меньше, чем число вершин, если в ориентированном графе есть цикл.