(a) 0 1 2 1
Transkrypt
(a) 0 1 2 1
Inżynieria Danych Algorytmy grafowe Lista 2 1. Dana jest macierz sąsiedztw grafu G = (V, E), V = {v1 , . . . , v|V (G)| }: (a) 0 1 2 1 0 0 1 1 1 0 1 0 0 1 1 0 2 1 0 1 1 1 0 1 1 0 1 0 1 1 0 2 0 0 1 1 1 1 1 3 0 1 1 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 1 2 3 0 1 0 0 1 1 0 1 1 (b) 1 1 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 (c) 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 . Podać liczbę wierzchołków i krawędzi grafu G, znaleźć macierz incydencji grafu G oraz listy incydencji, podać maksymalny i minimalny stopień wierzchołka, znaleźć macierze incydencji grafów G[{v1 , v2 , v3 }], G[{v2 , v4 , v5 , v6 }]. 2. Dana jest macierz icydencji grafu G = (V, E), V = {v1 , . . . , v6 }, postaci 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 . Znaleźć macierz sąsiedztw grafu G, podać listy sąsiedztw tego grafu. 3. Dana jest klasa Graf reprezentująca graf. Zakładamy, że wierzchołki grafu indeksujemy liczbami całkowitymi od 0 do n − 1, gdzie n jest liczbą wierzchołków. W klasie Graf zdefiniowano następujące konstruktory: Graf(int n) Graf(Scanner in) tworzy graf bezkrawędziowy o n wierzchołkach wczytuje graf ze skanera in oraz metody: int n() int m() boolean czyWierzch(int u) boolean czyKrawedz(int u, int w) boolean dodajKr(int u, int w) String toString() ArrayList<Integer> sasiedzi(int u) zwraca liczbę wierzchołków zwraca liczbę krawędzi sprawdza, czy u jest wierzchołkiem grafu sprawdza, czy {u, w} jest krawędzią grafu dodaje krawędź {u, w} do grafu i zwraca true, jeżeli u, w są wierzchołkami grafu, przeciwnie zwraca false wypisuje graf w postaci łańcucha znaków zwraca sąsiadów wierzchołka u, jeżeli u nie jest wierzchołkiem grafu, zwraca wyjątek (Pełna implementacja klasy Graf będzie podana na zajęciach.) Korzystając z powyższych informacji, wykonaj zadania. (a) Dla zapisanego w pliku graf1.txt grafu napisz, jak będą wyglądały listy sąsiedztwa zbudowane na podstawie tego pliku przez drugi konstruktor klasy Graf. (b) Rozważmy graf o czterech wierzchołkach 0, . . . , 3 oraz krawędziach {0, 1}, {1, 2}, {2, 3} i {3, 0}. Narysuj listę sąsiedztwa wierzchołków tego grafu, która nie mogła powstać przez wywołania metody dodajKr() dla tych krawędzi niezależnie od kolejności ich dodawania. 1 (c) Napisz klasę GrafTest posiadającą metodę main, w której przetestujesz klasę Graf. (Testy mają obejmować tworzenie grafu za pomocą pierwszego konstruktora, a następnie dodawania odpowiednich krawędzi, jak i wczytywanie grafu z pliku tekstowego. Format danych wejściowych (dla grafu o n wierzchołkach i m krawędziach) jest następujący: podajemy 2m + 1 wartości całkowitoliczbowych — pierwszą wartość n, następnie m par wartości (z zakresu 0, . . . , n − 1) określających krawędzie. Przykładowe pliki: graf1.txt, graf2.txt.) (d) Napisz klasę GrafStopnie, zawierającą metody: int stopien(Graf G, int u) zwracającą stopień wierzchołka u w grafie G; int minStopien(Graf G) zwracającą maksymalny stopień wierzchołka w G; int maxStopien(Graf G) zwracającą minimalny stopień wierzchołka w G; ArrayList<Integer> ciagStopni(Graf G) zwracającą ciąg stopni wierzchołków grafu w postaci listy tablicowej; int liczPetle(Graf G) podającą liczbę pętli w grafie. (e) Utwórz konstruktor kopiujący dla klasy Graf. Konstruktor powinien przyjmować graf G jako dane wejściowe oraz tworzyć i inicjować nową kopię grafu. Zmiany wprowadzone przez klienta w G nie powinny wpływać na nowo utworzony graf. 2