Проблема в том, что для заданного графа найдите самый длинный простой цикл в графе.Я искал вопрос и нашел эту ссылку Нахождение самого длинного цикла в ориентированном графе с использованием DFS .Ответ объясняет, что это трудная проблема NP.
Но меня смущает следующий алгоритм, который, кажется, работает за O (| V | + | E |), потому что мы посещаем каждый край ровно один раз.
поддерживает следующие переменные:
(1) global max
: длина самого длинного цикла на графике.
(2) Map<GraphNode, Integer> cache
: хранит длину самого длинного цикланачиная с ключевого узла.
(3) Map<GraphNode, Integer> pathVisited
: сохраняет посещенный узел на пути и соответствующий номер шага.Например, A -> B -> C -> A, если начинается с A, карта будет выглядеть как {A -> 1, B -> 2, C -> 3}, а когда снова входит в A, шаг становится4, и, следовательно, длина цикла составляет 4 - 1 = 3
(4) Set<GraphNode> visited
: содержит полностью изученные узлы graph.
dfs(GraphNode cur, int curStep, Set<GraphNode> visited, Map<GraphNode, Integer> cache, Map<GraphNode, Integer> pathVisited):
if visited.containsKey(cur), then
return // if the node have been explored, no need to explore again
// if see a cycle, update the results(cache)
if pathVisited.containsKey(cur), then
newCycleLen = curStep - pathVisited.get(cur)
cache.put(cur, max {newCycleLen, cache.get(cur)})
return
// no cycle yet, continue the search
pathVisited.put(cur, curStep)
for each neighbor of cur:
dfs(neighbor, curStep + 1, cache, pathVisited)
endfor
visited.add(cur); // current node have been explored, in the future no need to visit it again.
path.remove(cur)
Мне кажется, что приведенный выше алгоритм может решитьпроблема во времени O (| V | + | E |), потому что после полного исследования одного узла мы не будем запускать dfs на этом узле снова.
Может кто-нибудь подсказать, почему неправильный алгоритм выше?