Inżynieria Danych Algorytmy grafowe Lista 3 1. Dodaj do klasy Graf
Transkrypt
Inżynieria Danych Algorytmy grafowe Lista 3 1. Dodaj do klasy Graf
Inżynieria Danych Algorytmy grafowe Lista 3 1. Dodaj do klasy Graf następujące metody boolean usunKr(int u, int v) usuwającą krawędź {u, v} z grafu; metoda powinna zwracać true, jeżeli zadana krawędź należała do grafu, false w przeciwnym przypadku; int dodajW() dodającą do grafu nowy wierzchołek, o kolejnym indeksie, zwracającą indeks dodanego wierzchołka; boolean usunW(int u) usuwającą wierzchołek u z grafu, metoda powinna zwracać true, jeżeli dany wierzchołek należał do grafu, false w przeciwnym przypadku. 2. Stwórz klasę GrafProsty, dziedziczącą po klasie Graf, reprezentującą graf prosty, tzn. zabronione są pętle i wielokrotne krawędzie. 3. Stwórz klasy GrafCykl, GrafPelny, GrafDroga, dziedziczące po klasie GrafProsty, reprezentujące odpowiednio cykl, graf pełny i drogę o n wierzchołkach. Algorytm DFS 4. Dla grafów H1 , H2 przedstawionych na rysunkach i dla grafów z zadania 1 z listy nr 2 wyznacz drzewo (lub las, w przypadku grafów niespójnych) DFS (zaczynając od dowolnie wybranego wierzchołka grafu). Uwaga. należy odpowiednio zmodyfikować algorytm DFS tak, aby wyznaczał las DFS grafu. 5. Klasa DFSkomponenty wyznacza spójne składowe grafu: indeksuje składowe liczbami od 0 do liczby składowych i dla każdego wierzchołka v grafu określa, do której składowej należy v. Zmodyfikuj klasę DFSkomponenty w taki sposób, aby umożliwiała wyznaczenie liczby wierzchołków każdej składowej spójności grafu. 6. Ułóż algorytm, bazujący na DFS, który będzie określał, czy dany graf jest dwudzielny. Prześledź działanie algorytmu na małych grafach. Następnie zaproponuj implementację tego algorytmu. (Możesz uzupełnić definicję poniższej klasy DFSdwudzielny, dodając odpowiednie pola oraz uzupełniając kod metod.) public class DFSdwudzielny{ public DFSdwudzielny(Graf G) private void dfs(Graf G, int v) public boolean czyDwudzielny( ) } 7. Ułóż algorytm, bazujący na DFS, który będzie określał, czy dany graf prosty jest acykliczny. Prześledź działanie algorytmu na małych grafach. Następnie zaproponuj implementację tego algorytmu. (Możesz uzupełnić definicję poniższej klasy DFScykl, dodając odpowiednie pola oraz uzupełniając kod metod.) public class DFScykl{ public DFScykl(GrafProsty G) private void dfs(GrafProsty G, int v, int u) public boolean czyZawieraCykl( ) } (*) Czy krawędzie wielokrotne są przeszkodą w działaniu algorytmu? A pętle? Zmodyfikuj kod tak, aby umożliwiał też analizę grafów zawierających pętle (krawędzie wielokrotne). 1 4 1 3 8 2 3 6 1 2 6 4 5 7 5 H1 H2 Figure 1. 2