(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