Под удалением источника я полагаю, вы имеете в виду на каждом этапе удаление узла без входящих ребер.
Я думаю, вы просите найти максимальный эйлеров тур по вашему графу (т.е. цикл с уникальными ребрами, в то время как узлы могут повторяться).
Очевидно, что ни одна вершина в цикле не может быть удалена (ни одна вершина в цикле не будет иметь нулевых входящих ребер), поэтому этот алгоритм определенно сохраняет все циклы (и самый большой), но все же он не поможет вам найти < / em>, оставшиеся ребра не гарантированно входят в какой-либо цикл (я легко могу построить пример, в котором описываемый вами алгоритм сохраняет все ребра, в то время как самые большие цикл просто имеет размер два, поэтому не очень помогает в поиске последнего).
Вот как вы можете это сделать:
Вас интересует распознавание задних ребер, т. Е. В обходе ребра, которое указывает на предка (в дереве DFS, которое создается ребрами посещающих узлов в первый раз) посещенный узел. Например, если в стеке DFS есть узлы [A-> B-> C-> D] и пока вы исследуете D, вы обнаруживаете край D-> B, это задний край. Каждый задний край определяет цикл.
Что еще более важно, циклы, индуцированные задними ребрами, являются базовым набором циклов графа. «Базовый набор циклов»: вы можете построить все циклы графа, просто объединив и XORing циклы базового набора. Например, рассмотрим циклы [A1-> A2-> A3-> A1] и [A2-> B1-> B2-> B3-> A2]. Вы можете объединить их в цикл: [A1-> A2-> B1-> B2-> B3-> A2-> A3-> A1]. Поскольку вам нужен максимальный цикл, вам не нужно рассматривать XOR.
- Постройте максимальный цикл, объединив все базовые циклы, которые пересекаются в узле. (Если вы сделаете это осторожно, это также должно иметь линейную временную сложность).
С другой стороны, если вам требуется максимальный цикл без повторяющейся вершины, это будет намного сложнее линейного :)
person
Dimitris Andreou
schedule
06.04.2010