Rodzaje, przechodzenie grafu Grafy Rodzaje, przechodzenie grafu
Grafy podstawowe definicje Grafem nazywamy strukturę G=(V,E) składającą się ze skończonego i niepustego zbioru wierzchołków V i zbioru krawędzi E. Krawędź od wierzchołków u do v oznaczamy jako (u,v). Drogą od wierzchołka v1 do vj nazywamy sekwencję krawędzi: (v1,v2), (v2,v3),…, (vn-1,vn) Dwa wierzchołki vi i vj nazywamy sąsiędnimi, jeżeli w zbiorze D istnieje krawędź (vi,vj). Taką krawędź nazywamy incydentną do wierzchołków vi, vj. Stopniem wierzchołka v deg(v) – nazywamy liczbę krawędzi do niego incydentnych. Jeśli deg(v)=0 to jest to wierzchołek izolowany.
Rodzaje grafów: Grafy proste graf pełny – każdy wierzchołek jest połączony krawędzią z każdym wierzchołkiem
Rodzaje grafów: Grafy złożone Multigraf – dwa wierzchołki mogą być połączone kilkoma krawędziami Pseudograf – pojawiają się pętle czyli krawędzie wychodzące z i wchodzące do tego samego wierzchołka
Rodzaje grafów: Grafy złożone Graf skierowany – krawędzie, zwane też łukami, spełniają warunek (u,v)≠(v,u) 5 2 4 6 1 Graf ważony – gdy krawędziom zostają przyporządkowane liczby – wagi
Reprezentacja grafów A B C D E Graf A B C D E B C D A D A C Lista sąsiedztwa
Reprezentacja grafów A B C D E A B C D E 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 Macierz sąsiedztwa AB AC AD CD A B C D E 1 1 1 0 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 Macierz incydencji
Przechodzenie w głąb funkcja dfs() for wszystkie wierzcholki Visited[v]:=false; Ustaw wskaźnik current[v] na pierwszy wierzchołek na liście L[v] Odwiedz(p); visited[p]=true; If current[p] nie puste Stos pusty; push(stos,p); while stos jest niepusty v=wierzcholek(stos); niech w będzie wierzchołkiem wskazywanym przez current[v] przesuń wskaźnik current[v] do następnego wierzchołka na liście L if current[v]=pusty pop(stos); if not visited[w] odwiedz(w) visited[w]=true; if current[w] różne od nil then push(stos,w)
Przechodzenie grafów – wszerz funkcja bfs() for wszystkie wierzcholki Visited[v]:=false; Ustaw wskaźnik current[v] na pierwszy wierzchołek na liście L[v] Odwiedz(p); visited[p]=true; If current[p] nie puste Kolejka pusta; enqueue(koljka,p); while stos jest niepusty v=początek(kolejka); niech w będzie wierzchołkiem wskazywanym przez current[v] przesuń wskaźnik current[v] do następnego wierzchołka na liście L if current[v]=pusty dequeue(kolejka); if not visited[w] odwiedz(w) visited[w]=true; if current[w] różne od nil then enqueue(kolejka,w)
Bibliografia A. Drozdek, „C++. Algorytmy i struktury danych”, Helion, Gliwice 2004; L. Banachowski, K. Diks, W. Rytter, „Algorytmy i struktury danych”, WNT, Warszawa1996;