Reprezentacje grafów

Macierz sąsiedztwa: przykład

M = \begin{bmatrix} 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 1 & 0 & 1 & 0 & 1 \\ 0 & 1 & 0 & 1 & 1 & 0 & 0 & 0 \\ 0 & 1 & 1 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 1 & 0 & 1 & 0 & 0 \\ 0 & 1 & 0 & 0 & 1 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 1 \\ 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 \end{bmatrix}

Lista sąsiedztwa: przykład

0 → 1
1 → 0, 2, 3, 5, 7
2 → 1, 3, 4
3 → 1, 2, 4
4 → 2, 3, 5
5 → 1, 4, 6
6 → 5, 7
7 → 1, 6

Przechodzenie grafu

DFS

\begin{algorithm}
\begin{algorithmic}
\PROCEDURE{Dfs}{$ G $}
    \STATE {$ colors \gets \emptyset $} \COMMENT { tablica długości $|G.V|$ }
    \FORALL {$ u \in G.V $}
        \STATE {$ colors[u] \gets \text{WHITE} $}
    \ENDFOR
    \FORALL {$ u \in G.V $}
        \IF {$ colors[u] = \text{WHITE} $}
            \STATE \CALL{DfsVisit}{$ G, u, colors $}
        \ENDIF
    \ENDFOR
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}
\begin{algorithm}
\begin{algorithmic}
\PROCEDURE{DfsVisit}{$ G, u, colors $}
    \STATE {$ colors[u] \gets \text{GRAY} $}
    \FORALL {$ v \in G.adjacent[u] $} \COMMENT { $v$ takie, że istnieje krawędź $(u,v)$ }
        \IF {$ colors[v] = \text{WHITE} $}
            \STATE \CALL{DfsVisit}{$ G, v, colors $}
        \ENDIF
    \ENDFOR
    \STATE {$ colors[u] \gets \text{BLACK} $}
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}

BFS

\begin{algorithm}
\begin{algorithmic}
\PROCEDURE{Bfs}{$ G, s $}
    \STATE {$ colors \gets \emptyset $} \COMMENT { tablica długości $|G.V|$ }
    \FORALL {$ u \in G.V \setminus \{s\} $}
        \STATE {$ colors[u] \gets \text{WHITE} $}
    \ENDFOR
    \STATE {$ colors[s] \gets \text{GRAY} $}
    \STATE {$ Q \gets \emptyset $} \COMMENT { kolejka FIFO }
    \STATE \CALL{Enqueue}{$ Q, s $}
    \WHILE {$ Q \neq \emptyset $}
        \STATE {$ u \gets $ \CALL{Dequeue}{$ Q $}}
        \FORALL {$ v \in G.adjacent[u] $} \COMMENT { $v$ takie, że istnieje krawędź $(u,v)$ }
            \IF {$ colors[v] = \text{WHITE} $}
                \STATE {$ colors[v] \gets \text{GRAY} $}
                \STATE \CALL{Enqueue}{$ Q, v $}
            \ENDIF
        \ENDFOR
    \STATE {$ colors[u] \gets \text{BLACK} $}
    \ENDWHILE
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}

Sortowanie topologiczne

Algorytm Kahna sortowania topologicznego:

  1. Powtarzaj dopóki graf zawiera wierzchołki
    1. Znajdź w grafie wierzchołek niezależny u tj. taki, który ma zerowy stopień wejściowy
    2. Dodaj wierzchołek do rozwiązania i usuń go z grafu

4


4, 3


4, 3, 2


4, 3, 2, 1


4, 3, 2, 1, 5


4, 3, 2, 1, 5, 6


4, 3, 2, 1, 5, 6, 7


4, 3, 2, 1, 5, 6, 7, 8


Algorytm sortowania topologicznego oparty o DFS

  1. Wykonaj przegląd grafu przy pomocy DFS, a w momencie kolorowania wierzchołka na czarno, umieść jego indeks na stosie
  2. Wartości pobierane ze stosu ułożone będą zgodnie z porządkiem topologicznym

Stos:


Stos: 1


Stos: 1, 2


Stos: 1, 2


Stos: 1, 2, 8


Stos: 1, 2, 8, 3


Stos: 1, 2, 8, 3


Stos: 1, 2, 8, 3, 7, 6, 5, 4


Cykle w grafie

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

Generowanie losowych grafów

Generowanie losowego grafu skierowanego

\begin{algorithm}
\begin{algorithmic}
\FUNCTION{RandomDirectedGraph}{$ n, b $}
    \STATE {$ G \gets \emptyset $} \COMMENT { stwórz pusty graf z $n$ wierzchołkami }
    \STATE {$ m \gets b \cdot n^2 $} \COMMENT { liczba łuków w grafie }
    \FOR {$ i \gets 0 $ \TO $ m $}
        \REPEAT
            \STATE {$ u \gets $} \CALL{Random}{$ 0, n-1 $}
            \STATE {$ v \gets $} \CALL{Random}{$ 0, n-1 $}
        \UNTIL {$ u \neq v $ \AND $ (u, v) \notin G.E $}
        \STATE {$ G.E \gets G.E \cup \{ (u, v) \}  $}
    \ENDFOR
\ENDFUNCTION
\end{algorithmic}
\end{algorithm}

Generowanie losowego i acyklicznego grafu skierowanego (DAG)

Generowanie losowego, nieskierowanego grafu z cyklem Eulera

Generowanie losowego, skierowanego grafu z cyklem Hamiltona

Generowanie losowego, skierowanego grafu bez cyklu Hamiltona

Zadanie

Ocena 3.0

Ocena 3.5

Ocena 4.0

Ocena 4.5

Ocena 5.0