Algorytmy i struktury danych Reprezentacja grafu Wybrane problemy Graf 11 Prosty Skierowany Wielokrotne krawędzie 11 Pętle Wagi 7 10 Reprezentacja grafu Macierz sąsiedztwa A 1 B B D A B C D 1 0 0 A C 1 1 C D Lista sąsiedztwa A B B A C C B D D B C D Jeśli macierz jest symetryczna (graf nieskierowany), można przechowywać tylko jedną połówkę. Reprezentacja grafu p m n o p m 0 1 0 1 Macierz incydencji Lista incydencji m n 1 0 1 1 o 0 1 0 1 p 1 1 1 0 m p n n m o o p n p m n o p o n Reprezentacja wag Macierz sąsiedztwa Lista incydencji A 2 A B C D A 0 0 0 0 B 2 0 0 0 C 0 3 0 2 D 0 7 5 0 A B A,2 C B,3 D,2 D B,7 C,5 7 D 5 2 B 3 C Składowe spójnosci DFS Minimalne drzewo spinające 2 4 2 1 3 6 2 8 3 Zastosowania – np. budowa sieci dróg 6 4 5 Minimalne drzewo spinające Alg Kruskala: Wybieraj kolejno krawędzie o minimalnej wadze tak, by nie tworzyły cyklu. Pot. problem: stwierdzanie obecności cyklu. Alg Prima-Dijkstry: Drzewo = krawędź o minimalnej wadze; Spośród krawędzi incydentnych z aktualnym drzewem wybierz krawędź o najmniejszej wadze; Dodaj krawędź do drzewa. Pot. problem: grafy niespójne. Minimalna droga 2 4 3 1 3 6 7 9 3 7 3 4 Zastosowania: - wybór najkrótszej (najszybszej) trasy przejazdu; - wybór najtańszego procesu technologicznego. Alg. Dijkstry 1. 2. 3. 4. Z.: Wagi są nieujemne Dla sąsiadów wierzchołka startowego S ustaw odległość di równą wadze krawędzi e(s,i), dla każdego wierzchołka innego niż S inicjujemy di = Spośród nieodwiedzonych wierzchołków wybierz wierzchołek i o mininimalnej ogległości di Dla sąsiadów j wybranego wierzchołka aktualizuj odległość jako min{ dj, di+e(j,w) } Jeżeli są nieosiągnięty został wierzchołek końcowy K (lub są nieodwiedzone wierzchołki gdy nie zadajemy K) przejdź do punktu 2 Droga, cykl Eulera Marszruta – otwarta (zamknięta), zawierająca wszystkie krawędzie w grafie Zastosowania: Problem chińskiego listonosza; Rysowanie/wycinanie figur przy pomocy plotera. Minimalne drzewo spinające Algorytm Dijkstry: Dla wszystkich wierzchołków ustal s=; Dla w. początkowego P ustal s=0. Podstaw D={P}; Zaktualizuj odległość s’ dla wszystkich wierzchołków sąsiednich do D; s’[w] = min { s[x] + waga krawędzi {x, w} ; po wszystkich x należących do D }; Wybierz wierzchołek o minimalnej s’, podstaw dla niego s=s’. D = D {w}. Algorytm pozwala efektywnie wyznaczyć sieć dróg z określonego wierzchołka do wszystkich innych. Pot. problem: ujemne wagi. Cykl Eulera - alg Fleury’ego Wystartuj z wierzchołka o nieparzystym stopniu (jeśli jest); Wybierz dowolną krawędź, ale most wybieraj w ostateczności; Przejdź do kolejnego wierzchołka. Algorytm działa dla grafów eulerowkich, półeulerowskich. Problematyczna jest jednak implementacja testu, czy krawędź jest mostem. Cykl Eulera – alg. ze stosem Wystartuj z dowolnego wierzchołka; Jeżeli istnieją nie przechodzone dotąd krawędzie incydentne z bieżącym wierzchołkiem: • Wybierz dowolną krawędź; • Przejdź do kolejnego wierzchołka i odłóż go na stos; W przeciwnym wypadku: • Przenieś wierzchołek do rozwiązania i zdejmij go ze stosu; • Przejdź do wierzchołka na szczycie stosu. Algorytm wymaga grafu eulerowskiego.