Cykle w grafie

Generowanie grafu z cyklem Hamiltona i Eulera

  1. Stwórz wierzchołki
  2. Dodaj n krawędzi by utworzyć losowy cykl Hamiltona (np. 1, 6, 3, 2, 5, 8, 7, 4, 1)
  3. Dopóki liczba krawędzi w grafie jest mniejsza niż oczekiwana, wykonuj krok 4
  4. Znajdź losowo trzy wierzchołki u, v i w, takie że nie istnieje krawędź (u,v), (u,w) ani (v,w) i dodaj takie krawędzie (np. u=2, v=7, w=6)

Algorytm sprawdzania mostu w grafie

  1. Uruchom DFS dla grafu G rozpoczynając w wierzchołku u, a następnie wyznacz liczbę odwiedzonych wierzchołków
  2. Usuń krawędź (u,v), i ponownie uruchom DFS rozpoczynając z wierzchołka u; po wyznaczeniu liczby odwiedzonych wierzchołków przywróć krawędź (u,v)
  3. Zwróć TAK jeśli liczba odwiedzonych wierzchołków w kroku 1 jest różna od wyniku w kroku 2, w przeciwnym razie zwróć NIE

Algorytm Fleury’ego znajdowania cyklu Eulera

  1. Zacznij w dowolnym wierzchołku u (ponieważ wygenerowany graf ma wszystkie wierzchołki o parzystym stopniu)
  2. Powtarzaj dopóki są krawędzie w grafie:
    1. Dodaj u do rozwiązania
    2. Jeżeli istnieje krawędź (u,v), która nie jest mostem, to wybierz ją do kolejnego kroku, w przeciwnym razie wybierz krawędź (u,v), która jest mostem
    3. Usuń wybraną krawędź (u,v)
    4. Przypisz u ← v


Rozwiązanie: 0



Rozwiązanie: 0, 1



Rozwiązanie: 0, 1, 2



Rozwiązanie: 0, 1, 2, 4



Rozwiązanie: 0, 1, 2, 4, 5



Rozwiązanie: 0, 1, 2, 4, 5, 2



Rozwiązanie: 0, 1, 2, 4, 5, 2, 3

Algorytm Hierholzera znajdowania cyklu Eulera

  1. Utwórz stos, czyli strukturę danych typu LIFO (Last-In-First-Out)
  2. Dodaj na stos dowolny wierzchołek u (ponieważ wygenerowany graf ma wszystkie wierzchołki o parzystym stopniu)
  3. Dopóki stos nie jest pusty:
    1. Niech u będzie wierzchołkiem ze szczytu stosu (bez zdejmowania wartości ze stosu)
    2. Jeżeli istnieje krawędź (u,v) to usuń ją z grafu, odłóż v na stos, przypisz u ← v i powtarzaj krok 3.2
    3. Zdejmij wartość ze szczytu stosu i dodaj ją do rozwiązania


Stos: 0, 1
Rozwiązanie:



Stos: 0, 1, 2
Rozwiązanie:



Stos: 0, 1, 2, 3
Rozwiązanie:



Stos: 0, 1, 2, 3, 0
Rozwiązanie:



Stos: 0, 1, 2, 3
Rozwiązanie: 0



Stos: 0, 1, 2
Rozwiązanie: 0, 3



Stos: 0, 1, 2, 4
Rozwiązanie: 0, 3



Stos: 0, 1, 2, 4, 5
Rozwiązanie: 0, 3



Stos: 0, 1, 2, 4, 5, 2
Rozwiązanie: 0, 3



Stos: 0, 1, 2, 4, 5
Rozwiązanie: 0, 3, 2

Stos:
Rozwiązanie: 0, 3, 2, 5, 4, 2, 1, 0

Algorytm z powracaniem znajdowania cyklu Hamiltona

  1. Niech u ← path[n-1] (ostatni wierzchołek na ścieżce)
  2. Jeżeli n = |V|
    1. Niech v ← path[0]. Zwróć TAK jeżeli istnieje krawędź (u,v), w przeciwnym razie zwróć NIE
  3. Znajdź krawędź (u,v), taką że v \notin path
    1. Jeżeli taka krawędź istnieje, dodaj v do path i sprawdź wynik rekurencyjnego wywołania tego algorytmu dla n+1
    2. Jeżeli odpowiedź brzmi TAK to również zwróć wartość TAK. W przeciwnym razie wróć do kroku 3 i wybierz inną krawędź
  4. Zwróć NIE


n = 1   path = [0]



n = 2   path = [0, 1]



n = 3   path = [0, 1, 2]



n = 4   path = [0, 1, 2, 3]



n = 5   path = [0, 1, 2, 3, 5]



n = 6   path = [0, 1, 2, 3, 5, 4]
Wynik: NIE



n = 5   path = [0, 1, 2, 3, 5]
Wynik: NIE



n = 4   path = [0, 1, 2, 3]
Wynik: NIE



n = 3   path = [0, 1, 2]



n = 4   path = [0, 1, 2, 4]



n = 5   path = [0, 1, 2, 4, 5]



n = 6   path = [0, 1, 2, 4, 5, 3]
Wynik: TAK

Zadanie