Перечисление наборов узлов непрямого/невзвешенного графика

На неориентированном и невзвешенном графике, как можно перечислить все группы подключенных узлов, имеющих длину 1,2, ..., n (n - заданное пользователем значение)?

Этот вопрос похож на этот один ; с этой разницей: для n = 3; Мне также требуется найти путь: A-B-C и C-E-F.

Если n равно 4, то пути должны также включать:

А-В-С-D

А-В-С-Е

А-В-С-Р

А-С-Е-Р

Думаю, это проблема чего-то подобного; «все пары - все пути», где каждый путь может содержать не более n узлов. Не могли бы вы также рассказать о методах вычислительной сложности?

Я думаю, что мне нужно одновременно использовать как DFS, так и BFS, но я не уверен, эффективен ли это?

1
nl ja de

1 ответы

В основном вы можете использовать DFS с дополнительной переменной, которая передается по рекурсии length , которая будет уменьшена на каждой итерации. Условие останова будет, когда эта дополнительная переменная достигнет 0.

Что-то вроде:

DFS(source,length,path):
   print path //this is always done, because we want all paths up to n
   if (length == 0): //stop clause
      return
   for each (source,u) is an edge:
       path.append(u)
       DFS(u,length-1,path)
       path.removeLast() //clean up environment

Другой (менее эффективный, но может быть более элегантный) делает Iterative Deepening DFS , с length = 1,2, ..., n (и помещает печать только в предложение остановки)

0
добавлено
@ user1959766: здесь path - это список, а path.removeLast() удаляет из него последний элемент. path.append (u) добавляет u в конец списка
добавлено автор amit, источник
@ user1959766: вы ничего не удаляете, вы удаляете его только из current , только после того, как вы закончите изучать его как можно больше. неужели я вас не понимаю?
добавлено автор amit, источник
Спасибо за ответ. Не могли бы вы рассказать, что вы подразумеваете под path.removeLast ()?
добавлено автор banbar, источник
Благодарю. Тем не менее, я думаю, что проблема сохраняется: поскольку последний элемент удален, мы также теряем некоторые из наборов узлов. В приведенном примере, как можно определить группу узлов A-B-C, если мы удалим B?
добавлено автор banbar, источник
Во-первых, я думаю, что я неправильно поставил вопрос вначале (извините за причиненные неудобства), лучший способ: найти набор связанных групп узлов (а не путей), где каждый размер группы <= n. Когда я проследил ваш псевдокод для длины = 2 (т. Е. N = 3) в примере, который я дал, я думаю, что результирующие группы узлов выглядят так: - A - AB - ABD - AC - ACE - ACF. Пожалуйста, поправьте меня, если я ошибаюсь.
добавлено автор banbar, источник