Помимо очевидного способа, когда вы фактически выполняете все возможные обходы DFS и BFS, вы можете попробовать этот подход:
Шаг 1. В обходе dfs, начиная с корня A, преобразуйте список смежности текущего посещаемого узла следующим образом: Сначала удалите родителя узла из списка. Во-вторых, сгенерируйте все перестановки оставшихся узлов в списке adj.
Итак, если вы находитесь в узле C, пришедшем из узла A, вы сделаете:
C -> ADE transform into C -> DE transform into C -> [DE, ED]
Шаг 2. После шага 1 у вас есть следующий преобразованный список adj:
A -> [CB, BC]
B -> []
C -> [DE, ED]
D -> []
E -> []
Теперь вы запускаете обработку, начиная с (A,0), где первый элемент в паре — это путь обхода, а второй — индекс. Предположим, у нас есть две очереди. Очередь BFS и очередь DFS. Ставим эту пару в обе очереди.
Теперь повторяем следующее сначала для одной очереди, пока она не опустеет, а затем для другой очереди.
Мы выталкиваем первую пару из очереди. Получаем (А,0). Узел A отображается на [BC, CB]. Итак, мы генерируем два новых пути (ACB,1) и (ABC,1). Поместите эти новые пути в очередь.
Возьмите первый из них из очереди, чтобы получить (ACB,1). Индекс равен 1, поэтому мы смотрим на второй символ в строке пути. Это C. Узел C отображается на [DE, ED].
- Дочерними элементами BFS этого пути будут (ACBDE,2) и (ACBED,2), которые мы получили путем добавления дочерней перестановки.
- Дочерние DFS этого пути будут (ACDEB,2) и (ACEDB,2), которые мы получили, вставив дочернюю перестановку сразу после C в строку пути.
Мы генерируем новые пути в зависимости от того, с какой очередью мы работаем, на основе вышеизложенного и помещаем их в очередь. Поэтому, если мы работаем с очередью BFS, мы вставляем (ACBDE,2) и (ACBED,2). Содержимое нашей очереди теперь: (ABC,1), (ACBDE,2), (ACBED,2).
Мы вытаскиваем (ABC,1) из очереди. Сгенерируйте (ABC,2), так как B не имеет потомков. И получите очередь: (ACBDE,2), (ACBED,2), (ABC,2) и так далее. В какой-то момент мы получим кучу пар, где индекс не содержится в пути. Например, если мы получаем (ACBED,5), мы знаем, что это законченный путь.
person
cyon
schedule
28.10.2012