псевдокод для нахождения замкнутых траекторий в графе

голоса
-1

У меня есть матрица adjaceny для графа, который отслеживает ребра между узлами при наличии 1 в соответствующем adjMat [I, J] = 1; С помощью этой матрицы adjaceny я хотел бы узнать, все замкнутые пути длины 4, которая существует в графике. Может кто-нибудь, пожалуйста, предоставить мне псевдокод. Спасибо

Задан 14/03/2009 в 20:38
источник пользователем
На других языках...                            


3 ответов

голоса
0

Применение глубины ограниченной глубины первого поиска каждого узел и записи узлов , где ДФС находит начальный узел. Для поиска см псевдокод здесь: http://en.wikipedia.org/wiki/Depth-limited_search . Вам просто нужно добавить что - то вроде

if(node' == node && node'.depth==4) memorize(node)

к началу цикла.

Ответил 14/03/2009 в 20:56
источник пользователем

голоса
2

Это звучит как домашнее задание, так что я не буду давать все это прочь. Но вот подсказка: так как вы заинтересованы в поиске циклов длины 4, возьмите 4-й степень матрицы смежности и сканирование по диагонали. Если любой элемент М [я, я] не равен нулю, существует цикл, содержащий вершину я.

Ответил 14/03/2009 в 20:57
источник пользователем

голоса
1

Возможно , это не является оптимальным способом вычислить его (это O(n^4)), но очень простой путь сканирования через все вершины

a, b, c, d such that b > a, c > b, d > c

Вы можете проверить, а затем проверить для каждого из следующих циклов:

 1. ([а, Ь] && [Ь, с] && [с, d] && [д, а])
 2. ([а, Ь] && [б, г] && [д, с] && [с, а]) 
 3. ([а, d] && [д, Ь] && [Ь, с] && [с, а])

 1: 2: 3:
 --- B A --- ВАВ
 | | \ / | \ / |
 | | X | X |
 | | / \ | / \ |
 D --- --- C D ПЗС

Вы в основном проверять каждый упорядоченное множество вершин (а, б, в, г) для 3-х способов, которыми они могут образовывать цикл.

Таким образом, псевдо-код будет выглядеть так:

for a = 0 to <lastVertex>
 for b = a + 1 to <lastVertex>
  for c = b + 1 to <lastVertex>
   for d = c + 1 to <lastVertex>

    if(IsCycle(a,b,c,d)) AddToList([a,b,c,d])
    if(IsCycle(a,b,d,c)) AddToList([a,b,d,c])
    if(IsCycle(a,c,b,d)) AddToList([a,c,b,d])

   next d
  next c
 next b    
next a
Ответил 14/03/2009 в 21:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more