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