Нет необходимости изменять что-либо в топологической сортировке, вы можете просто использовать это и выполнить последующую обработку.
псевдокод высокого уровня:
- запустить топологическую сортировку,результирующий массив будет
arr
- создать пустой список ребер, пусть он будет
l
- для каждой вершины
v
в arr
[упорядоченная итерация]:
3.1.за каждый (v,u)
в E
:
3.1.1.append (v,u) to l
- return
l
Преимущество этого метода в том, что вы можете использовать топологическую сортировку как черный ящик, не изменяя его и просто публиковать-процесс для получения желаемого результата.
Корректность [эскиз доказательства]:
Так как для каждого ребра (v,u)
- u
появляется после v
в топологической сортировке,когда вы его печатаете, это делается через v
, и, таким образом, (v,u)
печатается до того, как вы напечатаете любую вершину, прикрепленную к u
.
Сложность :
O(|V|+|E|)
топологическая сортировка, O(|V|+|E|)
для постобработки [повторение всех вершин и всех ребер].