pseudokod znalezienia zamkniętej ścieżki na wykresie

głosy
-1

Muszę matrycę adjaceny na wykresie, które śledzi krawędzie między węzłami o o 1 w odpowiednim adjMat [i, j] = 1; Przez tę matrycę adjaceny i chcą uzyskać wszystkie zamknięte ścieżki o długości 4, który występuje w wykresie. Może ktoś proszę podać mnie z pseudo kod. Dziękuję

Utwórz 14/03/2009 o 20:38
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
0

Nałożyć depth-first-przeszukiwanie ograniczone do głębokości każdy węzeł i węzły płytowych gdzie DFS znajdzie węzeł początkowy. Do poszukiwań zobaczyć pseudo-kod tutaj: http://en.wikipedia.org/wiki/Depth-limited_search . Trzeba tylko dodać coś takiego

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

do początku pętli.

Odpowiedział 14/03/2009 o 20:56
źródło użytkownik

głosy
2

To brzmi jak praca domowa, więc nie dam całość dalej. Ale oto wskazówka: skoro jesteś zainteresowany znalezieniem cykle długości 4, podjąć 4th moc macierz sąsiedztwa i skanowanie wzdłuż przekątnej. Jeśli dowolny wpis K [i, j] jest niezerowe, to jest cykl zawierający wierzchołek i.

Odpowiedział 14/03/2009 o 20:57
źródło użytkownik

głosy
1

Może to nie jest optymalnym sposobem na to (to obliczyć O(n^4)), ale bardzo prosty sposób jest skanowanie przez wszystkie wierzchołki

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

Można sprawdzić, a następnie sprawdzić dla każdego z następujących cyklach:

 1. ([a, b] && [b, d] && [c, d] && [D, A])
 2. ([a, b] && [b, d] && [D, C] && [c a]) 
 3. ([a, d] && [d b] && [b, d] && [c a])

 1: 2: 3:
 A --- B A --- BAB
 | | \ / | \ / |
 | | X | X |
 | | / \ | / \ |
 D C D --- --- CCD

Jesteś w zasadzie sprawdzenie każdej uporządkowany zbiór wierzchołków (a, b, c, d) do 3 sposoby, które mogą oni tworzą cykl.

Więc pseudo kod byłoby:

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
Odpowiedział 14/03/2009 o 21:15
źródło użytkownik

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