Grafy - Mat

Transkrypt

Grafy - Mat
Mosty królewieckie
W osiemnastym wieku mieszkańcy Królewca lubili spacerować po mostach na rzece
Pregole, których mieli w mieście siedem. Plan mostów pokazuje rysunek.
Ale takie zwykłe spacerowanie po jakimś czasie im się znudziło, i zaczęli
zastanawiać się, czy jest taka trasa spacerowa, która przechodzi przez każdy most
dokładnie raz, żadnego nie omija, i pozwala wrócić do punktu wyjścia.
Nie potrafili sami rozwiązać tego problemu, więc napisali do znanego już wtedy
matematyka Leonharda Eulera. Euler pokazał, że nie istnieje rozwiązanie tego
zadania. (Jeśli wejdzie się po raz trzeci na wyspę, nie ma jak z niej wyjść.)
Można tę sytuację przedstawić jako graf o wielokrotnych krawędziach:
Trzeba w tym grafie znaleźć cykl Eulera, czyli cykl przechodzący przez wszystkie
wierzchołki i wszystkie krawędzie tego grafu, ale przez każdą krawędź tylko raz.
W opublikowanej w 1736 roku pracy Euler sformułował pierwsze twierdzenie teorii
grafów, które dziś zapisujemy następująco:
W grafie można znaleźć cykl Eulera wtedy i tylko wtedy, gdy graf jest spójny i każdy
jego wierzchołek ma parzysty stopień.
Znając to twierdzenie zawsze można stwierdzić, czy łamigłówka typu "narysuj figurę
nie odrywając ołówka od kartki" ma rozwiązanie.
1
Fleury podał algorytm, który pozwala znaleźć cykl Eulera w każdym grafie, w którym
on istnieje.
Zadanie 1
Spróbuj samodzielnie znaleźć cykl Eulera w poniższym grafie.
Początek formularza
Dół formularza
Teoria grafów
Graf to zbiór wierzchołków, który na rysunku zwykle reprezentujemy kropkami, na
przykład:
oraz krawędzi łączących wierzchołki, co na rysunku można przedstawić
następująco:
2
Czasem dopuszcza się wielokrotne krawędzie i pętle (czyli krawędzie o początku i
końcu w tym samym wierzchołku):
Niekiedy wygodnie jest rozważać grafy o krawędziach skierowanych (grafy
skierowane):
Wiele zastosowań mają grafy ważone, w których każdej krawędzi
przyporządkowano liczbę - wagę, może ona oznaczać na przykład odległość między
wierzchołkami:
W grafach etykietowanych każdy wierzchołek ma swoją nazwę - etykietę:
Tak więc grafy, o których uczy się w szkole podstawowej, to grafy skierowane,
ważone, o zaetykietowanych wierzchołkach:
3
Należy pamiętać, że rysunek grafu to tylko jedna z wielu jego reprezentacji
graficznych. Każdy graf można narysować na wiele sposobów. Oto kilka
reprezentacji graficznych tego samego grafu:
Problem kojarzenia małżeństw
Dlaczego kojarzenia małżeństw?
Załóżmy, że mamy k kawalerów i p panien oraz dla każdej z panien podany jest zbiór
kawalerów, których zna.
Czy jest możliwe wydanie za mąż każdej z kobiet za kawalera, którego zna ?
Sformułowanie przy pomocy grafów.
Zbudujmy graf, którego zbiór wierzchołków składa się z dwóch rozłącznych
podzbiorów: zbioru kawalerów K i zbioru panien P. Wierzchołek x ze zbioru K
łączymy krawędzią z wierzchołkiem y z P jeśli panna y zna kawalera x. W
otrzymanym grafie nie istnieją krawędzie między żadnymi dwoma wierzchołkami ze
zbioru P ani żadnymi dwoma ze zbioru K. Jest to więc graf dwudzielny. Poszukiwany
jest w tym grafie zbiór krawędzi M taki, że:
1. żadna para krawędzi należących do M nie ma wspólnego
wierzchołka (małżenstwa są rozłączne - nie dopuszczamy bigamii!!!),
2. każdy wierzchołek ze zbioru P jest końcem pewnej krawędzi ze
zbioru M(każda panna wychodzi za mąż).
Zbiór krawędzi spełniający takie warunki nazywamy skojarzeniem doskonałym.
4
Kiedy rozwiązanie problemu kojarzenia małżeństw istnieje ?
P. Hall sformułował i udowodnił w 1935 roku twierdzenie, które podaje warunek
konieczny i dostateczny na to by problem kojarzenia małżeństw miał rozwiązanie.
Twierdzenia Halla
Problem kojarzenia małżenstw ma rozwiązanie wtedy, gdy każde m panien zna
łącznie co najmniej m kawalerów, dla m=1,2, ...p.
Przykład.
Oto przykładowy graf dla zbioru P złożonego z trzech panien i zbioru K złożonego z
trzech kawalerów.
Każda z panien zna dokładnie dwóch kawalerów. Skojarzenie doskonałe istnieje i
może wyglądać następująco:
Ania powinna wyjść za Tomka, Kasia za Arka a Zosia za Jasia. Popatrzmy teraz na
następujący graf.
5
W tym grafie skojarzenie doskonałe nie istnieje. Ania i Kasia znają tylko Tomka. Nie
uda się więc znaleźć równocześnie męża dla obydwu panien.
Zastosowania.
Problem ten posiada bardziej poważne zastosowania. Przy użyciu tej samej metody
możemy rozwiązać problem polegający na przydzieleniu pracownikom zajęć zgodnie
z ich kwalifikacjami. W tym przypadku przez P należy rozumieć zbiór pracowników, K
zbiór zadań do wykonania. Dwa wierzchołki x i y łączymy krawędzią jeśli praca y jest
zgodna z kwalifikacjami pracownika x (to znaczy może on ją wykonywać).
Problem znajdowania najkrótszej drogi
Wyobraźmy sobie pewną mapę. Na mapie zaznaczone są drogi między
poszczególnymi miastami oraz długości tych dróg. Wybierając z tej mapy dowolne
dwa miasta A i B chcemy zaplanować najkrótszą trasę z miasta A do miasta B.
Jak rozwiązać ten problem używając grafów ?
Stwórzmy graf, którego wierzchołki odpowiadają miastom znajdującym sie na danej
mapie. Wierzchołki łączymy krawędzią jeśli istnieje bezpośrednia (nie przebiegająca
przez żadne inne miasto zaznaczone na tej mapie) droga łącząca odpowiadające im
miasta. Krawędziom nadajemy wagi równe długości danej drogi. Oczywiście długość
drogi możemy zastąpić przez czas trwania podróży lub jej koszt. Znalezienie
najkrótszej drogi z miasta A do miasta B oznacza znalezienie pomiędzy
odpowiadającymi im wierzchołkami drogi o możliwie najmniejszej sumie wag
krawędzi.
Kiedy rozwiązanie tego problemu istnieje ?
Jesteśmy w stanie znaleźć najkrótszą drogę, jeśli droga między danymi miastami
(wierzchołkami w grafie) w ogóle istnieje. Aby można było znaleźć najkrótsze drogi
między dowolną parą miast utworzony dla danej mapy graf musi być spójny.
Algorytm rozwiązujący ten problem.
Najbardziej znanym algorytmem rozwiązującym ten problem jest algorytm Dijkstry.
Opis algorytmu Dijkstry
Algorytm Dijks znajduje najkrótszą drogę z wierzchołka s (zwanego źródłem) do
wierzchołka t (zwanego ujściem) w grafie, w którym wszystkim krawędziom nadano
nieujemne wagi. Polega na przypisaniu wierzchołkom pewnych wartości liczbowych.
Taką liczbę nazwijmy cechą wierzchołka. Cechę wierzchołka v nazwiemy stałą (gdy
jest równa długości najkrótszej drogi z s do v) albo, w przeciwnym przypadku,
tymczasową. Na początku wszystkie wierzchołki, oprócz s, otrzymują tymczasowe
cechy ∞ . źródło s otrzymuje cechę stałą równą 0. Następnie wszystkie wierzchołki
połączone krawędzią z wierzchołkiem s otrzymują cechy tymczasowe równe
6
odległości od s . Potem wybierany jest spośród nich wierzchołek o najmniejszej
cesze tymczasowej. Oznaczmy go v . Cechę tego wierzchołka zamieniamy na stałą
oraz przeglądamy wszystkie wierzchołki połączone z v. Jeśli droga z s do któregoś z
nich, przechodząca przez v ma mniejszą długość od tymczasowej cechy tego
wierzchołka, to zmniejszamy tą cechę. Ponownie znajdujemy wierzchołek o
najmniejszej cesze tymczasowej i zamieniamy cechę tego wierzchołka na stałą.
Kontynuujemy to postępowanie aż do momentu zamiany cechy wierzchołka t na
stałą (czyli obliczenia długości najkrótszej drogi z s do t).
Zastosowania.
Algorytmy znajdujące najkrótszą drogę w grafie są wykorzystywane do wyznaczania
najlepszej trasy pomiędzy dwoma miastami na 'komputerowych' mapach. Mapy takie
przydatne są w pracy np. firm transportowych.
Problem chińskiego listonosza
Dlaczego listonosza ?
W swojej pracy, listonosz wyrusza z poczty, dostarcza przesyłki adresatom, by na
koncu powrócić na pocztę. Aby wykonać swoją pracę musi przejść po każdej ulicy w
swoim rejonie co najmniej raz. Oczywiście chciałby, aby droga, którą przebędzie,
była możliwie najkrótsza.
Dlaczego chińskiego ?
Problem ten został sformułowany po raz pierwszy w języku teorii grafów przez
chinskiego matematyka Mei Ku Kwana w 1962 roku.
Sformułowanie problemu.
Rozważmy graf, którego krawędzie odpowiadają ulicom w rejonie, obsługiowanym
przez listonosza. Wierzchołki to po prostu skrzyżowania ulic. Krawędziom nadajemy
wagi, które oznaczają odległości między dwoma skrzyżowaniami. Znalezienie
możliwie najkrótszej drogi, którą musi przejść listonosz sprowadza sie do znalezienia
w tym grafie drogio minimalnej sumie wag krawędzi, która przechodzi przez każdą
krawędź co najmniej raz.
Jeśli graf posiada cykl Eulera.
Jeśli dany graf posiada cykl Eulera, to istnieje taka droga, która zaczyna i konczy sie
w tym samym punkcie i wymaga przejścia po każdej ulicy dokładnie raz. Zauważmy,
że ponieważ każdy cykl Eulera przechodzi raz przez każdą krawędź to suma wag
krawędzi (długość drogi, którą musi przejść listonosz) jest zawsze taka sama (nie
zależy od wierzchołka, w którym cykl ten zaczyna się i konczy). Rozwiązaniem jest
więc dowolny cykl Eulera w tym grafie.
Jeśli graf nie posiada cyklu Eulera.
W takim przypadku listonosz będzie zmuszony przejść niektórymi ulicami
7
wielokrotnie. Rozwiązanie jest więc cyklem, w którym suma długości krawędzi
wybranych więcej niż raz jest możliwie najmniejsza.
Przykład
Na rysunku pokazany est układ ulic niedaleko Politechniki Warszawskiej. Załóżmy,
że fragmenty tych pięciu ulic tworzą rejon listonosza.
Obok nazw ulic umieszczone są odległości w metrach. Prostokąt oznaczony literą P
oznacza miejsce, w którym umieściliśmy pocztę, na której pracuje 'nasz' listonosz.
(Na marginesie: nazwy i układ ulic są prawdziwe, jednak podane odległości oraz
umiejscowienie poczty nie odpowiadają rzeczywistości. Pocztę umieściliśmy w
miejscu, gdzie w rzeczywistości znajduje się Gmach Główny, Oto jak wygląda graf
odpowiadający danemu układowi ulic. Zauważmy, że graf ten nie ma cyklu Eulera
ponieważ posiada dwa wierzchołki, z których wychodzi nieparzysta liczba krawędzi.
Na rysunku zaznaczono również rozwiązanie czyli optymalną trasę listonosza.
Zwróćmy uwagę, że listonosz musi przejść dwukrotnie tylko ulicę Noakowskiego, zaś
pozostałe ulice dokładnie raz. Powyższa droga jest najkrótszą z możliwych ponieważ
odcinek, po którym przechodzi dwukrotnie liczy tylko 500 metrów i nie istnieje trasa
spełniająca zadane warunki o krótszym odcinku, który listonosz musi pokonać więcej
niż raz.
8
Czym różni się problem mostów królewieckich od problemu chińskiego
listonosza ? Rozwiązanie problemu chińskiego listonosza istnieje zawsze o ile graf
jest spójny.
Natomiast problem mostów królewieckich, a mówiąc ogólniej problem znalezienia
cyklu Eulera w grafie, nie zawsze ma rozwiązanie. Jeśli jednak graf posiada cykl
Eulera, to rozwiązanie jednego z tych problemów jest również rozwiązaniem dla
drugiego.
Algorytm Fleury'ego
Jest to algorytm znajdujący cykl Eulera w grafie. Jak już wiemy, jeśli graf posiada taki
cykl, to jest on rozwiązaniem rozważanego problemu. Po wprowadzeniu pewnych
modyfikacji może posłużyć również do rozwiązywania problemu chinskiego
listonosza w przypadku grafów, które nie mają cyklu Eulera.
Opis Algorytmu Fleury'ego
Startujemy z dowolnego wierzchołka. Każda kolejna krawędź, po której
przechodzimy, wybierana jest spośród krawędzi wychodzących z wierzchołka, w
którym aktualnie się znajdujemy. Wybieramy oczywiście krawędź, po której jeszcze
nie przeszliśmy. O ile jest to możliwe, usunięcie wybranej krawędzi nie powinno
rozciąć grafu na dwa 'kawałki'. Jeśli uda nam się, postępując w ten sposób, dojść do
wierzchołka, z którego wyruszyliśmy i przejść przez wszystkie krawędzie, to
otrzymana droga jest cyklem Eulera.
Problem komiwojażera
Dlaczego komiwojażera ?
Komiwojażer ma do odwiedzenia pewna liczbę miast. Chciałby dotrzeć do każdego z
nich i wrócić do miasta, z którego wyruszył. Dane są również odległości mie=ędzy
miastami. Jak powinien zaplanować trasę podróży, aby w sumie przebył możliwie
najkrótsza drogę? Przez 'odległość' miedzy miastami możemy rozumieć odległość w
kilometrach, czas trwania podróży miedzy tymi miastami albo koszt takiej podróży
(na przykład cenę biletu lotniczego). W tym ostatnim przypadku, poszukiwanie
optymalnej trasy polega na zminimalizowaniu całkowitych kosztów podróży. Tak wiec
możemy poszukiwać trasy najkrótszej albo najszybszej albo najtańszej. Zakładamy
przy tym, że odległość miedzy dowolnymi dwoma miastami jest nie większą niż
długość jakiejkolwiek drogi łączącej te miasta, która wiedzie przez inne miasta.
Założenie to tylko z pozoru wydaje się być zawsze spełnione. Rozważmy
następujący przykład. Załóżmy, że interesuje nas czas trwania podróży koleją.
Najszybsze połączenie z Katowic do Białegostoku wiedzie przez Warszawę. Czas
trwania tej podróży traktujemy w tym przypadku jako 'odległość' z Katowic do
Białegostoku.
Sformułowanie problemu.
Zbudujmy graf ważony, którego wierzchołki są miastami. Każda parę miast połączmy
krawędziami. Każdej krawędzi nadajemy wagę równa 'odległości' miedzy miastami
odpowiadającymi wierzchołkom, które są końcami tej krawędzi. Otrzymujemy w ten
9
sposób graf pełny, który ma tyle wierzchołków ile miast musi odwiedzić komiwojażer
(wliczając w to miasto, z którego wyrusza). Odwiedzenie wszystkich miast odpowiada
cyklowi, który przechodzi przez każdy wierzchołek danego grafu dokładnie raz. Cykl
taki nazywamy cyklem Hamiltona. Poszukujemy wiec w grafie pełnym cyklu
Hamiltona o minimalnej sumie wag krawędzi.
Przykład
Na rysunku pokazano graf ważony o wierzchołkach odpowiadających pięciu miastom
polskim. Wagami krawędzi są odległości podane w kilometrach. Poszukujemy
rozwiązania następującego problemu:
Komiwojażer wyrusza z Warszawy i chce odwiedzić wszystkie pozostałe cztery
miasta a następnie wrócić do Warszawy. Jak powinien zaplanować podróż, aby
przebył możliwie najmniejsza liczbę kilometrów?
Już przy pięciu miastach wszystkich możliwych tras podróży komiwojażera jest
. Można zauważyć, że przy większej liczbie miast rozważanie
wszystkich możliwości nie jest najlepszym pomysłem.
Dlaczego rozwiązanie tego problemu zawsze istnieje ?
Dowolny graf pełny posiada co najmniej jeden cykl Hamiltona. Ponieważ graf ma
skończona liczbe wierzchołków, to w zbiorze cykli Hamiltona istnieje taki
(niekoniecznie jedyny), który posiada minimalna sumę wag krawędzi.
Algorytmy rozwiązujące problem komiwojażera.
Istnieje wiele algorytmów rozwiązujących ten problem. Wszystkie maja jedna
podstawowa wadę. Wymagają rozważenia bardzo dużej liczby przypadków i czas ich
działania może być bardzo długi. Niewielki przyrost liczby miast powoduje 'duży'
wzrost ilości przypadków do rozważenia i tym samym czasu działania algorytmu.
Jeden z możliwych algorytmów polega na obliczeniu całkowitej długości wszystkich
istniejących w danym grafie cykli Hamiltona. Jest to jednak bardzo skomplikowane
10
już dla liczby miast niewiele większej od pieciu. Na przykład dla 20 miast liczba cykli
Hamiltona w grafie pełnym o 20 wierzchołkach wynosi
czyli około
.
Algorytmy przybliżone
Czas rozwiązywania problemu komiwojażera można zmniejszyć stosując jeden ze
znanych algorytmów przybliżonych, które nie wymagają rozważania aż tak dużej
liczby przypadków. Jednak algorytmy takie nie zawsze znajdują optymalne
rozwiązanie. Stworzona przez nie trasa może być znacznie 'dłuższa' od najkrótszej.
Stosowanie algorytmów przybliżonych wynika z konieczności wyboru pomiędzy
szybkością znajdowania a 'jakością' znalezionego rozwiazan. Z reguły zakłada się,
że wynik działania takiego algorytmu nie może być gorszy od optymalnego o więcej
niż pewna ustalona z góry wartość.
Jak wyglądałby algorytm przybliżony dla problemu gotowania ziemniaków ?
Załóżmy, że nie możemy czekać aż pół godziny do czasu gdy proces gotowania
ziemniaków się zakończy. Co wtedy robimy ? Stosujemy algorytm przybliżony !!!
Możemy przecież 'niedokładnie' obrać ziemniaki lub wyjąć z wody 'lekko'
niedogotowane. Wynik działania takiego algorytmu nie będzie może najsmaczniejszy
ale zaoszczędzimy na czasie, który będziemy mogli wykorzystać na przykład na
poczytanie o teorii grafów. Oczywiście z góry zakładamy dopuszczalna jakość.
Musimy określić, co to znaczy 'lekko' niedogotowane. Nie możemy przecież jeść
ziemniaków surowych! Znajdowanie cyklu Hamiltona w dowolnym grafie. W
grafie pełnym cykl Hamiltona zawsze istnieje. W dowolnym grafie może jednak nie
istnieć. Problem polegający na znalezieniu cyklu Hamiltona jest podobnie jak
problem komiwojażera 'trudny' ze względu na długi czas działania znanych
algorytmów. Do znalezienia takiego cyklu może wystarczyć 'trochę szcześcia'. Gorzej
jest kiedy cykl Hamiltona w badanym grafie nie istnieje. W takim przypadku możemy
nawet być zmuszeni do sprawdzenia wszystkich możliwych permutacji zbioru
wierzchołków, aby uzyskać pewność, że cykl taki nie istnieje.
Problem niezawodności sieci
Wyobraźmy sobie, że chcemy zaprojektować sieć komunikacyjną (np.
telekomunikacyjną, drogową, komputerową). Składa się ona z pewnej liczby punktów
węzłowych (np. terminali komputerowych) i bezpośrednich połączeń (linii) między
niektórymi z nich.
Jak przedstawić sieć komunikacyjną przy pomocy grafu ? Sieć taką możemy
przedstawić za pomocą grafu, którego wierzchołki odpowiadają punktom węzłowym
a krawędź miedzy dwoma wierzchołkami oznacza bezpośrednie połączenie linią
danych dwóch punktów węzłowych. Oto przykładowa sieć składająca się z 6 punktów
węzłowych oznaczonych literami A,B,C,D,E,F i pewnych krawędzi między nimi
11
Wiemy, że nic nie jest doskonałe i sieć narażona jest na awarie. Spójność
wierzchołkowa takiego grafu jest równa minimalnej liczbie awarii w punktach
węzłowych sieci, które spowodują awarię całej sieci (to znaczy między niektórymi
węzłami zostanie zerwane połączenie). Natomiast spójność krawędziowa oznacza
minimalną liczbę awarii łączy między węzłami, które spowodują awarię sieci. Przez
niezawodność sieci możemy rozumieć maksymalną liczbę awarii, których
wystąpienie nie spowoduje awarii całej sieci.
Im większa spójność grafu tym większa niezawodność sieci Jak skonstruować
sieć by jej niezawodność byla możliwie największa? Oczywiście im więcej linii
(krawędzi) tym niezawodność większa. Z drugiej jednak strony zbudowanie każdego
połączenia kosztuje. Możemy założyć, że szukamy możliwie najtańszej sieci o z góry
założonej niezawodności, bądź szukamy sieci o ustalonym koszcie i możliwie
największej niezawodności. Jedno z możliwych sformułowań tego problemu wygląda
następująco:
Sformułowanie problemu.
Załóżmy, że dana jest liczba punktów węzłowych oraz żądana niezawodność sieci k
(liczba 'dopuszczalnych' awarii). Zbudowanie każdego bezpośredniego połączenia
obarczone jest pewnym kosztem jednostkowym (jest to pewne uproszczenie - w
rzeczywistości koszty budowy połączeń są różne). Chcemy zaprojektować sieć o
żądanej niezawodności, której koszt budowy będzie możliwie najmniejszy.
Poszukujemy więc grafu o n wierzchołkach i możliwie najmniejszej liczbie krawędzi,
którego
spójność wierzchołkowa lub spójność krawędziowa wynosi k.
Znajdowanie liczby chromatycznej grafu
Sformułowanie problemu.
Dane: graf G
Szukane: liczba chromatyczna grafu G
12
Przykładowe zastosowanie Przy pomocy algorytmów znajdujących optymalne
pokolorowanie wierzchołków grafu można rozwiązać następujący problem dotyczący
składowania substancji chemicznych: Zakłady chemiczne wykorzystują przy
produkcji n surowców chemicznych. Wiadomo, że niektóre substancje nie mogą być
przechowywane razem, gdyż zetknięcie ich ze sobą spowodowałoby 'zniszczenie
magazynu', ewentualnie katastrofę ekologiczną. Jaka jest minimalna liczba
magazynów potrzebna do przechowywania wszystkich surowców chemicznych
używanych w tej fabryce ?
Jak to zrobić używając grafu ?
Tworzymy graf, którego n wierzchołków odpowiada poszczególnym surowcom
chemicznym. Dwa wierzchołki łączymy krawędzią jeśli nie mogą być przechowywane
razem. Minimalna liczba magazynów potrzebnych do składowania tych surowców
jest równa liczbie chromatycznej tego grafu.
Dlaczego tak jest ?
Rozważmy dowolne pokolorowanie wierzchołków tego grafu, w którym każde dwa
wierzchołki połączone krawędzią sa pokolorowane innym kolorem. Surowce
odpowiadające wierzchołkom pokolorowanym tym samym kolorem mogą być
składowane w jednym magazynie !
Znajdowanie indeksu chromatycznego grafu
Sformułowanie problemu.
Dane: graf G
Szukane: indeks chromatyczny grafu G
Przykładowe zastosowanie.
Rozważmy następujący problem. Dany jest zbiór m nauczycieli oraz zbiór n klas.
Podane są także liczby godzin zajęć jakie musi odbyć w ciągu tygodnia dany
nauczyciel z każdą z klas. Szukana jest minimalna liczba godzin w tygodniu, w
czasie których mogą odbyć się wszystkie zajęcia. Wiadomo, że w danym momencie
czasu nauczyciel może uczyć tylko jedną klasę i każda klasa może być uczona przez
tylko jednego nauczyciela.
Jak rozwiązać problem układania planu zajęć przy pomocy grafów? Stwórzmy
graf dwudzielny, którego zbiór wierzchołków można podzielić na dwa rozłączne
zbiory odpowiadające nauczycielom oraz klasom. W grafie tym dopuszczamy
istnienie wielu krawędzi między każdą parą wierzchołków. Wierzchołek
odpowiadający nauczycielowi łączymy tyloma krawędziami z wierzchołkiem
odpowiadającym klasie ile godzin zajęć musi on odbyć z tą klasą w ciągu tygodnia.
Zauważmy, że jeśli pokolorujemy krawędzie tego grafu tak, aby każde dwie mające
wspólny koniec były różnych kolorów, to krawędzie pokolorowane tym samym
kolorem odpowiadają zajęciom, które mogą odbywać się równocześnie.
13
Poszukujemy więc minimalnej liczby kolorów potrzebnych do pokolorowania w ten
sposób wszystkich krawędzi. Innymi słowy, poszukiwany jest indeks chromatyczny
tego grafu. Problem ten można oczywiście skomplikować dodając założenia
dotyczące sal, w których zajęcia mogą się odbywać, bądź narzucając pewne terminy,
w których dane zajęcia muszą sie odbyć.
Przykład
Przypuśćmy, że mamy 5 nauczycieli: profesorów Mroza, Nowaka, Pawlaka, Cicho i
Lisa oraz 4 klasy maturalne. Na poniższym rysunku pokazany jest graf stworzony na
podstawie informacji o tym ile godzin zajęć w tygodniu z daną klasą ma poprowadzić
każdy z nauczycieli.
Dla przykładu: profesor Mróz ma 2 godziny z IVa i 1 godzinę z IVb a profesor Nowak
po 1 godzinie z IVa i IVc. Indeks chromatyczny tego grafu wynosi 4. Czyli w ciągu 4
godzin uda się przeprowadzić wszystkie zajęcia. Widać, że mniejsza liczba godzin
nie wystarczy ponieważ profesor Lis musi przeprowadzić 4 godziny zajęć. Również
klasy IVa, IVc oraz IVd mają zaplanowane po 4 godziny. A oto jak wygląda
pokolorowanie krawędzi tego grafu na 4 kolory, w którym żadne dwie krawędzie o
wspólnym wierzchołku nie mają tego samego koloru.
Jeżeli przyjmiemy, że każdy kolor oznacza pewien 45 minutowy okres czasu (np.
8.15 - 9.00), to w prosty sposób tak pokolorowany graf można przekształcić w
poniższą tabelę.
14
prof. Mróz
----
----
----
IVa
IVb
IVa
prof. Nowak
prof. Pawlak
IVd
prof. Cicho
IVc
prof. Lis
IVb
----
IVc
IVa
IVa
IVc
IVd
IVd
IVb
IVc
IVd
W wierszach odpowiadających poszczególnym nauczycielom wypisane są klasy,
które powinien uczyć o danej godzinie (przy czym u góry każdej kolumny zamiast
godziny jest kolor). Profesor Mróz ma najpierw godzinę z IVa potem godzinę z IVb,
znowu 1 lekcję z IVa i na koniec godzinę wolną. Kolejność terminów (kolorów)
możemy ustawić w dowolny sposób. Czyli profesor Mróz może mieć wpierw 2
godziny z IVa a potem 1 lekcję z IVb. Wymaga to tylko zamiany miejscami 2-ej i 3-ej
kolumny w tabeli.
Stopień wierzchołka
wierzchołka.
w grafie
to liczba krawędzi dochodzących do tego
Graf regularny albo r-regularny to graf, w którym każdy wierzchołek ma ten sam
stopień równy r .
Zad 2
Który z poniższych grafów jest 4-regularny?
15
Drogą w grafie G nazywamy taki ciąg jego wierzchołków v1,v2,...,vk , że każde dwa
kolejne wierzchołki w tym ciągu są połączone krawędzią (czyli można przejść z
jednego końca drogi na drugi chodząc tylko po krawędziach).
Zaznacz na rysunku dwa wierzchołki, a komputer pokaże ci jedną z dróg między nimi
(o ile istnieje).
Cykl w grafie G to droga w tym grafie, która kończy się w tym samym wierzchołku, w
którym się zaczęła.
Zad 3
Czy w poniższym grafie istnieje cykl zawierający wszystkie jego wierzchołki? A może
istnieje cykl, zawierający wszystkie wierzchołki oprócz jednego?
16
Taką drogę w grafie nazywamy cyklem Hamiltona.
??? Rozwiązanie zagadki sir Hamiltona sprowadza się do znalezienia cyklu
Hamiltona w poniższym grafie. Sprawdź, czy potrafisz.
Na rysunku podano przykładowy cykl Hamiltona w tym grafie.
17
Graf spójny to graf, w którym każde dwa wierzchołki są połączone drogą.
Inaczej mówiąc, graf śkłada się z jednego kawałka. Jeśli graf nie jest spójny, to jego
spójne kawałki, między którymi nie ma połączenia, nazywamy składowymi grafu.
??? Czy poniższy graf jest spójny? Jeśli nie, to znajdź jego składowe.
Graf nie jest spójny. Na rysunku pokazano dwie składowe grafu.
Graf G jest izomorficzny z grafem H jeśli istnieje takie, różnowartościowe i na,
przyporządkowanie (bijekcja) wierzchołków grafu H wierzchołkom grafu G , że jeśli
jakieś dwa wierzchołki są połączone krawędzią w jednym z grafów, to odpowiadające
im wierzchołki w drugim grafie również łączy krawędź.
Izomorfizm grafów zachowuje właściwie wszystkie interesujące własności, na
przykład: liczbę wierzchołków, liczbę krawędzi, stopnie wierzchołków, spójność,
planarność. Dlatego grafy izomorficzne zwykle utożsamia się.
18
??? Który z grafów B lub C jest izomorficzny z grafem A?
A:
B:
C:
Graf B jest izomorficzny z grafem A. Na rysunku podano bijekcję między
wierzchołkami obu grafów.
Graf C nie jest izomorficzny z grafem A, gdyż usunięcie dwóch zaznaczonych
wierzchołków spowoduje, że graf przestanie być spójny. W grafie A takie wierzchołki
nie istnieją.
19
A:
B:
C:
Podgraf grafu G to graf, którego wierzchołki stanowią podzbiór zbioru wierzchołków
grafu G , a krawędzie podzbiór zbioru krawędzi G.
??? Znajdź w grafie A podgraf izomorficzny z grafem B.
A:
B:
Na rysunku zaznaczono poszukiwany podgraf.
20
A:
B:
Graf nazywamy dwudzielnym jeśli zbiór jego wierzchołków można podzielić na takie
dwa rozłączne podzbiory X i Y , że każda krawędź grafu ma jeden koniec w X a drugi
w Y.
Innymi słowy są to wszystkie grafy, których wierzchołki można pokolorować na dwa
kolory tak, aby końce każdej krawędzi miały różne kolory.
??? Który z tych grafów jest dwudzielny?
A:
B:
21
Graf A nie jest dwudzielny, bo zawiera cykl o nieparzystej liczbie wierzchołków.
Zauważmy, że wierzchołków leżących na takim cyklu nie da się pokolorować na dwa
kolory tak, aby końce każdej krawędzi miały różne kolory.
Graf B jest dwudzielny. Podzbiory, na które dzielimy zbiór wierzchołków grafu,
zaznaczono na rysunku innym kształtem.
B:
Graf nazywamy płaskim lub planarnym jeśli można go narysować na płaszczyźnie
w ten sposób, że krawędzie nigdzie nie będą się przecinać.
Graf, którego nie można narysować tak, aby krawędzie nie przecinały się, nazywamy
nieplanarnym.
??? Czy poniższy graf jest planarny?
Tak. Na rysunku pokazano inny - bez przecinania się krawędzi - sposób narysowania
tego grafu. Ponumerowano wierzchołki obu grafów, aby lepiej uwidocznić izomorfizm
między nimi.
22
Grubością grafu nazywamy najmniejszą liczbę planarnych podgrafów, na które
można podzielić dany graf.
Grubość grafu G oznaczamy t(G).
Każdy graf planarny ma grubość równą 1.
??? Znajdź grubość poniższego grafu.
Można się przekonać, że graf nie jest planarny, więc jego grubość jest większa niż 1.
Na rysunku pokazano podział grafu na dwa grafy planarne, więc t(G) = 2.
23
Spójnością grafu lub spójnością wierzchołkową grafu nazywamy taką liczbę ,
że usunięcie z grafu pewnych wierzchołków spowoduje, że graf przestanie być
spójny lub zredukuje go do jednego wierzchołka, ale usunięcie dowolnych
wierzchołków zawsze pozostawi graf spójny.
(Wierzchołki usuwamy wraz z dochodzącymi do nich krawędziami.)
Spójność grafu
oznaczamy
.
??? Czy istnieje graf 3-regularny o spójności 1?
Takich grafów istnieje nieskończenie wiele. Na rysunku pokazano przykład grafu o
tych własnościach.
Spójnością krawędziową grafu nazywamy taką liczbę , że usunięcie z grafu
pewnych krawędzi spowoduje, że graf przestanie być spójny, ale usunięcie
dowolnych
krawędzi zawsze pozostawi graf spójny.
(Krawędzie usuwamy bez wierzchołków do których dochodzą.)
Spójność krawędziową grafu
oznaczamy
.
Można pokazać, że zachodzi zależność:
.
???
Czy istnieje graf o
i
?
24
Istnieje taki graf. Na rysunku pokazano przykład grafu o tych własnościach.
Liczbą chromatyczną grafu nazywamy najmniejszą liczbę kolorów, którymi można
pokolorować wierzchołki grafu w taki sposób, aby każde dwa wierzchołki połączone
krawędzią miały różne kolory.
Liczbę chromatyczną grafu
oznaczamy
.
??? Znajdź liczbę chromatyczną poniższego grafu.
=3. Na rysunku pokazano przykład pokolorowania wierzchołków grafu na 3
kolory.
25
Indeksem chromatycznym grafu nazywamy najmniejszą liczbę kolorów, którymi
można pokolorować krawędzie grafu w taki sposób, aby każde dwie krawędzie o
wspólnym końcu miały różne kolory.
Indeks chromatyczny grafu
oznaczamy
.
W 1964 roku Vizing udowodnił, że:
.
??? Znajdź indeks chromatyczny poniższego grafu.
=4. Na rysunku pokazano przykład pokolorowania krawędzi grafu na 4 kolory.
Przykłady grafów o ciekawych własnościach
•
Grafy puste
26
•
Grafy pełne
•
Grafy pełne dwudzielne
•
Koła
•
Drzewa i lasy
•
Grafy platońskie
•
Graf Petersena
•
Graf Grötzscha
Grafy puste składają się jedynie z wierzchołków, nie zawierają źadnych krawędzi.
Graf pusty o
wierzchołkach oznaczamy
.
Grafy puste mają następujące własności:
,
,
,
,
,
,
Cykl Hamiltona: nie posiadają.
Cykl Eulera: nie posiadają.
Są planarne.
27
Spróbuj zastanowić się, dlaczego tak jest.
Grafy pełne to grafy, w których każde dwa wierzchołki są połączone krawędzią. Graf
pełny o
wierzchołkach oznaczamy
Grafy pełne o
.
wierzchołkach mają następujące własności:
Mają
krawędzi.
,
,
,
,
,
dla n nieparz. n>1
dla n parzystych
Cykl Hamiltona: posiadają.
Cykl Eulera: posiadają jeśli
jest nieparzyste.
28
Są planarne tylko dla
.
Spróbuj zastanowić się, dlaczego tak jest.
Grafy pełne dwudzielne to grafy dwudzielne, które zawierają wszystkie możliwe
krawędzie przy zadanym podziale zbioru wierzchołków.
Graf pełny dwudzielny, którego wierzchołki podzielone są na zbiór elementowy i
elementowy oznaczamy
Grafy pełne dwudzielne o
Mają
krawędzi.
.
mają następujące własności:
,
,
,
,
,
,
Cykl Hamiltona: posiadają jeśli
Cykl Eulera: posiadają jeśli
i
.
są parzyste.
Są planarne tylko dla dla
Spróbuj zastanowić się, dlaczego tak jest.
.
29
W 1930 roku polski matematyk Kazimierz Kuratowski udowodnił, że najmniejsze
grafy nieplanarne to
i
, oraz że grafy nieplanarne to tylko te, które w pewien
sposób zawierają któryś z tych dwóch grafów.
Litera "K" w oznaczeniu grafów pełnych pochodzi właśnie od jego nazwiska, a grafy
i
często nazywa się grafami Kuratowskiego
Koła to grafy powstałe przez dodanie do cyklu jeszcze jednego wierzchołka i
połączenie tego wierzchołka ze wszystkimi wierzchołkami cyklu.
Koło o
Koła o
wierzchołkach oznaczamy
.
wierzchołkach mają następujące własności:
Istnieją dla
.
Mają
krawędzi.
,
,
,
,
dla n nieparz.
dla n parzystych
,
Cykl Hamiltona: posiadają.
Cykl Eulera: nie posiadają.
Są planarne.
Spróbuj zastanowić się, dlaczego tak jest.
30
Drzewa to grafy spójne nie zawierające żadnego cyklu.
Istnieje wiele różnych (nieizomorficznych) drzew o tej samej liczbie wierzchołków.
Oto przykłady drzew o wierzchołkach.
Drzewa
o
Mają
wierzchołkach mają następujące własności:
krawędzi.
,
,
,
,
,
Cykl Hamiltona: nie posiadają.
Cykl Eulera: nie posiadają.
Są planarne.
Spróbuj zastanowić się, dlaczego tak jest.
Graf, którego każda składowa jest drzewem nazywamy lasem. Oto przykład lasu:
31
Grafy platońskie to grafy utworzone z krawędzi i wierzchołków wielościanów
foremnych.
czworościan:
sześcian:
ośmiościan:
32
dwunastościan:
dwudziestościan:
O wielościanach foremnych wspomina też wykład z Algebry. A miniprogram pozwala
na bliższe zaznajomienie się z nimi.
Wszystkie grafy platońskie są regularne i planarne.
Łatwo można się przekonać, że grafy platońskie spełniają formułę Eulera, którą
możemy zapisać:
gdzie oznacza liczbę wierzchołków grafu, liczbę krawędzi, a liczbę obszarów
grafu. Przez obszary rozumiemy obszary spójne, na które dzielą płaszczyznę
krawędzie grafu narysowanego na tej płaszczyżnie. (Dla bryły będą to po prostu jej
ściany). Należy pamiętać przy tym, żeby policzyć też "obszar nieskończony", czyli
"zewnętrze" grafu.
Formułę Eulera spełniają wszystkie grafy planarne narysowane w ten sposób, że ich
krawędzie nie przecinają się.
33
Graf Petersena:
Graf Petersena jest 3-regularny.
,
,
,
,
,
,
Cykl Hamiltona: nie posiada.
Cykl Eulera: nie posiada.
Nie jest planarny.
Spróbuj zastanowić się, dlaczego tak jest.
Graf Grötzscha:
Graf Grötzscha ma następujące własności:
,
,
34
,
,
,
,
Cykl Hamiltona: posiada.
Cykl Eulera: nie posiada.
Nie jest planarny.
Spróbuj zastanowić się, dlaczego tak jest.
Pliki i proste pętle
Zadanie 1
Dany jest plik wejściowy DANE.TXT. W pierwszym wierszu pliku znajdują się 2 liczby: n i m oddzielone
spacjami. W każdym z kolejnych n wierszy znajduje się m liczb (typu Integer) oddzielonych spacjami.
Mozna założyć, że liczby m i n nie przekraczają 100.
Napisz program, który wczyta z pliku wejściowego liczby do tablicy dwuwymiarowej T : array
[1..100,1..100] of Integer. Następnie program powinien dla każdej kolumny tablicy (o
numerze od 1 do m) obliczyc sume wczytanych do niej liczb. Obliczone sumy należy następnie wypisać
do pliku WYNIK.TXT (tzn. wplik wynikowy powinien zawierac m liczb oddzielonych spacjami)
Zadanie 2
Tak jak powyżej ale z użyciem tablicy 1-wymiarowej T : array[1..100] od Integer zamiast 2wymiarowej
Zadanie 3
Są dwa pliki zawierające ciągi liczb oddzielone spacjami: DANE1.TXT i DANE2.TXT. W każdym pliku
liczby są uporządkowane, tzn każda kolejna liczba jest nie mniejsza od poprzedniej. Napisz program,
który do pliku WYNIK.TXT wypisze wszystkie liczby z obu plików wejściowych ale też uporządkowane.
Zadanie 4
Napisz program, który wczyta z pliku wejściowego dwie liczby. Liczby są w kolejnych wierszach. Liczby
mogą być bardzo długie, ale możesz założyć, że każda z nich ma nie więcej niż 1000 cyfr (każdą taką
liczbę można reprezentować w pamięci komputera jako tablicę cyfr L : array[1..1000] of
0..9.
Twój program powinien wypisać do pliku WYNIK.TXT (a) sumę danych liczb i (b) iloczyn danych liczb.
Listy
35
Zadanie 5
Napisz program, który utworzy listę jednokierunkową zawierającą liczby (liczby, które mają być
wstawione można wczytać z pliku wejściowego albo n. wylosować). Następnie napisz funkcję,
function Zawiera (glowa : PElListy; liczba : Integer) : Boolean
która zwróci True gdy lista podana przez wskaźnik do jej pierwszego elementu zawiera element
przechowujący liczbę podaną w parametrze liczba. W przeciwnym przypadku funkcja zwróci False.
Przetestuj działanie funkcji na utworzonej wcześniej liście.
Zadanie 6 (ciekawe)
Napisz procedurę, która sprawdzi, czy dane dwie listy mają wspólny element, (NIE chodzi o to czy
przechowują tą samą liczbę!)
Zadanie 7 (ciekawsze)
Napisz procedurę, która znajdzie piwerszy taki wspólny element opisany w poprzednim zadaniu.
Zadanie 8
n osob gra w wyliczanke. Co k-ta osoba odpada. Kto zostanie na koncu? Napisz funkcje, która dla
danych n i k zwróci numer osoby, która zostanie na koncu (osoby sa ponumerowane od 1 do n,
zaczynamy wyliczac od osoby nr 1, tzn gdy n > k to jako pierwsza odpada osoba k). Funkcja powinna
utworzyć jednokierunkowa liste cykliczna dlugosci n i usuwac odpowiednie jej elementy.
Drzewa
Zadanie 9
Dane (np. w pliku) n liczb uporzadkowanych. Zbudowac drzewo BST zawierajace te liczby. Glebokosc
drzewa powinna byc mniejsza niż log n + 1 (tzn. drzewo powinno byc optymalne).
Zadanie 10
Typ PWierzcholek jest wskaznikiem do wierzchołka drzewa binarnego zdefiniowanego jako
TWierzcholek = record
Liczba : Integer;
Lewy, Prawy : ^TWierzcholek;
end;
Natomiast PElListy jest wskaznikiem do elementu listy jednokierunkowej zdefiniowanego jako
TElListy = record
Liczba : Integer;
Nast : ^TElListy;
end;
Napisz funkcje function Liscie (d : PWierzcholek) : PElListy, która dla drzewa danego
jako wskaznik d do korzenia utworzy i zwróci liste zawierajaca liczby przechowywane w kolejnych
lisciach (od lewej do prawej). Na przyklad dla drzewa:
7
/ \
9
4
/ \
\
2
1
5
należy zwrócić listę zawierajaca kolejno 2, 1 i 5.
36
37