Общий порядок - это, в основном, просто расположение всех вершин в некотором порядке - думайте об этом как о маркировке каждой вершины числом от 1 до | V (G) |.Это дает нам непротиворечивый способ узнать, какая вершина выше для любой пары рассматриваемых нами вершин.
Да, вы можете получить полное упорядочение с помощью поиска в глубину.Просто присвойте каждой вершине значение инкрементного счетчика каждый раз, когда вы исследуете вершину в DFS.Вот как вы можете получить общий порядок.
Но вам не нужно явно указывать общий порядок для получения DAG.Если мы используем вышеуказанное время исследования в качестве нашего порядка, то мы можем действовать следующим образом: Ориентировать края, как вы делаете обход DFS, направляя каждый неориентированный край от вершины, которую вы в данный момент расширяете.
В основном, у нас есть вершины, которые мы исследовали ранее, указывающие на вершины, которые мы исследовали позже.
например.если у вас было
A
/ \
B---C
, и вы начали с исследования A, вы бы сориентировали края, падающие на A, от A:
A --> B
A --> C
B --- C
Теперь скажем, что вы выбрали B, чтобы исследовать следующий в вашей DFSВТП.Тогда вы оставите ребро между A и B в одиночку, потому что вы уже ориентировали это ребро (A уже полностью развернуто).Грань между B и C была нетронутой, так что отошли от нашей текущей вершины, B, чтобы получить:
A --> B
A --> C
B --> C
Когда вы исследуете C, все его соседи полностью развернуты, поэтому ничего не происходитосталось сделать для C, и больше нет вершин для исследования.
Ответ на "More Info":
В этом случае, просто убедитесь, что вы расширилиисходная вершина сначала и просто не исследуйте приемник.Например.для
A-B-C
|/
D
, где D - источник, а B - приемник, вы можете: развернуть D, затем A, затем C. Вы получите:
D --> A
D --> B
A --> B
C --> B