Направленный ациклический граф

Ориентированный ациклический граф или DAG — это ориентированный граф без ориентированных циклов. Он состоит из вершин и ребер, каждое ребро направлено от одной вершины к другой, так что эти направления никогда не образуют замкнутый цикл.

Ориентированный граф является DAG, только если он топологически упорядочен.

Что такое топологическая сортировка

Топологическая сортировка для направленного ациклического графа — это линейное упорядочение вершин таким образом, что для каждого направленного ребра u->v вершина u предшествует v в порядке. Топологическая сортировка для графа невозможна, если он не является DAG.
Для графа может быть более одной топологической сортировки. Первая вершина в топологической сортировке всегда является вершиной с нулевой степенью вхождения.

Алгоритм DFS для поиска топологической сортировки

Рассмотрим ориентированный ациклический граф.

  • Инициализировать пустой стек, посещенный логический массив.
  • Запустите dfs с узла. Передайте стек, посещенный массив и узел в рекурсивный метод.

dfs (узел, стек, посещено).

  • Внутри рекурсивной функции dfs отметьте узел как посещенный.
  • Пройдите через все непосещенные дочерние элементы узла.
  • Сделайте dfs на непосещенном ребенке.
  • Наконец, поместите узел в стек, если все дочерние элементы посещены.
  • После завершения обхода dfs проверьте, равен ли размер стека номеру узла.
    Если нет, граф не является DAG и не имеет топологического порядка.
    В противном случае вытолкните все элементы из стека и сохранить их в массиве результатов.
  • Вернуть результирующий массив.

Сложность времени и пространства

  • Мы проходим через все узлы и ребра. Таким образом, временная сложность будет O(V + E), где V = вершины или узлы, E = ребра.
  • Мы используем посещаемый массив, дополнительный стек и список смежности для графа. Таким образом, сложность пространства будет O(V) + O(V) + O(V + E) + дополнительное пространство для стека рекурсии.

Код

Первоначально опубликовано на:



Практическая проблема