Я ищу O (V + E) алгоритм для нахождения транзитивного сокращения с учетом DAG.
То есть удалите как можно больше ребер, чтобы, если бы вы могли достичь v от u, для произвольных v и u вы все еще можете достичь после удаления ребер.
Если это стандартная проблема, пожалуйста, укажите мне какое-нибудь модельное решение.
algorithms
graphs
dag
Каран
источник
источник
Ответы:
Мы можем решить эту проблему, просто используя DFS для каждой вершины.
Общая сложность описанного выше - сложность запуска DFS ', которая равна O ( N ( N + M ) ) .N O(N(N+M))
источник
Это не то что вы ищете. Но только для обмена знаниями цели, вы можете сделать это с сообщений , если предположить , что каждая вершина , чтобы выступать в качестве процессора . Обратите внимание, что каждая вершина имеет сопоставимое значение. Следовательно, существуют некоторые вершины, такие, что они больше, чем все их соседи. Эти вершины делают следующее:O(|E|)
источник
Лемма: Если существует ребро V -> Y и Y также является косвенным преемником V (например, V -> W -> + Y), то ребро V -> Y транзитивно и не является частью транзитивного корня.
Метод: Отслеживайте транзитивное замыкание каждой вершины, работая от терминала к начальным вершинам в обратном топологическом порядке. Множество косвенных наследников V - это объединение транзитивных замыканий непосредственных наследников V. Транзитивное замыкание V - это объединение косвенных наследников и его непосредственных наследников.
Алгоритм:
Это предполагает, что у вас есть какой-то эффективный способ отслеживания наборов вершин (например, битовых карт), но я думаю, что это предположение сделано и в других алгоритмах O (V + E).
Потенциально полезным побочным эффектом является то, что он находит транзитивное замыкание каждой вершины G.
источник
Я решил ту же проблему, но это было не совсем то же самое. Он попросил минимальное количество ребер в графе после редукции, чтобы изначально соединенные вершины все еще были соединены, и новые соединения не выполнялись. Как понятно, здесь говорится не о том, чтобы найти сокращенный граф, а о том, сколько избыточных ребер имеется. Эта проблема может быть решена в O (V + E). Ссылка на объяснение: https://codeforces.com/blog/entry/56326 . Но я думаю, что на самом деле сделать график будет сложнее, чем O (N)
источник