Kapitola Reprezentace grafu V kapitole?? jsme se dozvěděli, co to jsou grafy a k čemu jsou dobré. rzo budeme chtít napsat nějaký program, který s grafy pracuje. le jak si takový graf uložit do počítače? To si teď vysvětlíme. Všechny možné reprezentace si budeme vysvětlovat na následujícím grafu G = (V, ) a orientovaném grafu H = (W, F ). V každé sekci budou jejich reprezentace uvedeny jako příklad. a b c graf G graf H d V této knize označujeme vrcholy grafu písmeny abecedy. Je to tak lepší pro výklad a diskuse nad grafy v příkladech. V počítači označujeme vrcholy pomocí čísel, 2 až n. Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.. Seznam hran Uložíme si počet vrcholů a seznam všech hran. Hrana je dvojice vrcholů. V neorientovaných grafech je jedno, jestli si hranu uv pamatujeme jako dvojici uv nebo vu. le v případě orientovaných grafů už musíme dodržet správné pořadí vrcholů. Většinou za správné pořadí považujeme to po směru šipky. Orientovaný graf může kromě šipky uv obsahovat i opačnou šipku vu. Neorientovaný graf na obrázku má 5 vrcholů až a seznam hran,,,,,. Orientovaný graf má 4 vrcholy a až d a seznam hran ab, ac, ba, cb a dc. Tato reprezentace je vhodná spíše pro zadávání grafu na vstupu nebo pro skladování grafu na pevném disku. Často ale začínáme od a končíme vrcholem n.
2 KPITOL. RPRZNT GRFU.2 Matice sousednosti Matice sousednosti zachycuje, které vrcholy spolu sousedí. V matici si pro každou dvojici vrcholů (u, v) pamatujeme, jestli z vrcholu u vede hrana do vrcholu v. Z toho je vidět, že matice reprezentuje orientované grafy. Neorientovaný graf G si můžeme reprezentovat tak, že ho nejprve převedeme na orientovaný graf G a ten teprve reprezentujeme pomocí matice sousednosti. Orientovaný graf G dostaneme z G tak, že každou neorientovanou hranu uv nahradíme dvojicí šipek uv a vu, jdoucích proti sobě. Matice sousednosti má velikost n n a je definována jako = (a u,v ), kde a u,v = { uv uv Protože graf neobsahuje smyčky (hrany z v do v), tak je a v,v = pro každý vrchol v V. Podobně je vidět, že pro neorientované grafy dostaneme symetrickou matici. (G) = a b c d (H) = Matici sousednosti budeme celkem často používat, protože se s ní jednoduše pracuje. Hlavně velmi rychle zjistíme, jestli je uv hranou grafu. Matice sousednosti obsahuje jen nuly nebo jedničky. Často si ale boolovskou matici rozšíříme na matici integerů, protože pak si v a ij můžeme pamatovat ohodnocení hrany ij. Pokud graf není úplný, tak musíme určit jednu hodnotu, která znamená, že hrana neexistuje (běžně se bere počítačové, které pro integery je MXINT; podobně pokud jsou všechna ohodnocení hran nezáporná, tak můžeme použít ). Pokud si do a ij uložíme vzdálenost vrcholu i od vrcholu j, tak dostaneme matici vzdáleností..3 Seznam sousedů Reprezentaci si vysvětlíme pro orientované grafy. Neorientovaný graf G bychom si reprezentovali tak, že ho nejprve převedeme na orientovaný graf G, který už budeme umět reprezentovat (viz jak to bylo popsáno u matice sousednosti). Teď se podívejme, jak reprezentovat orientovaný graf G = (V, ). Pro každý vrchol v V si budeme pamatovat seznam jeho sousedů. To je vrcholy, do kterých z v vede hrana. a b c d
.4. VÝHOY NVÝHOY JNOTLIVÝH RPRZNTÍ 3 bychom se vyhnuli spojovým seznamům a přitom neplýtvali pamětí, tak jednotlivé seznamy poskládáme za sebe do jednoho pole. bychom neztratili přehled o tom, kde který seznam sousedů začíná, tak si stále ponecháme pole V[ ] obsahující ukazatele na začátky seznamů. Políčko V[i] bude obsahovat index do pole Sousedi[ ], na kterém začíná seznam sousedů vrcholu i. Seznam sousedů vrcholu i bude končit o jednu pozici dříve než začíná seznam sousedů vrcholu i +. bychom věděli kde končí seznam sousedů posledního vrcholu, tak rozšíříme obě pole o jedna (odpovídá to přidání fiktivního vrcholu s prázdným seznamem sousedů). V: 4 6 8 2 3 Sousedi: 2 3 4 5 6 7 8 9 2 3.4 Výhody a nevýhody jednotlivých reprezentací Nejprve si musíme rozmyslet, co chceme v grafu dělat. Mezi nejčastější operace patří testování, jestli jsou dva vrcholy u V a v V spojeny hranou. Jinými slovy potřebujeme zjistit, zda je uv hrana. ruhou častou operací je průchod všech sousedů vrcholu v. Následujíc tabulka shrnuje, jak dlouho tyto dotazy trvají v jednotlivých reprezentacích. Zároveň udává i prostorovou složitost každé reprezentace. Reprezentace Je uv hrana? Projít sousedy v Prostorová složitost seznam hran O(m) O(m) O(m) matice sousednosti O() O(n) O(n 2 ) seznam sousedů O(n) O(#sousedů) O(n + m) Matice sousednosti nám jako jediná reprezentace umožňuje v konstantním čase určit, jestli je uv hrana grafu (však je tomu šitá na míru). Pro řídké grafy (grafy, které mají málo hran) za to zaplatíme vyšší paměťovou náročností. Příkladem řídkých grafů jsou rovinné grafy, které mají nejvýše 3n 6 = O(n) hran. Na druhou stranu pro husté grafy (grafy, které mají alespoň c n 2 hran pro nějaké c > ) je to ideální reprezentace. Zabere lineárně mnoho prostoru ve velikosti grafu, testování, jestli je uv hrana, proběhne v čase O() a dokonce i průměrný počet sousedů je Ω(n). V některých algoritmech hodně často procházíme všechny sousedy některých vrcholů a testy, zda je uv hrana, ani nepotřebujeme. V takových případech je nejlepší použít reprezentaci grafu seznamem sousedů. Z předchozích odstavců je vidět, že je každá reprezentace někdy výhodná, každá jindy. Záleží na tom, co s grafem chceme provádět. Pro každý algoritmus si musíme vybrat individuálně. Poznámka: Někdy si spolu s grafem chceme reprezentovat i jeho další vlastnosti. Například pro rovinné grafy chceme znát seznam všech stěn. Pro každou
4 KPITOL. RPRZNT GRFU stěnu chceme rychle zjistit seznam hran a vrcholů, které obsahuje. Naopak pro každou hranu chceme vědět, ve kterých stěnách je obsažena. Návrh takové datové struktury už není složitý a proto necháváme na čtenáři, aby si rozmyslel, jak takové věci efektivně reprezentovat..5 Příklady. (Převody mezi reprezentacemi) Pro každé dvě reprezentace grafu navrhněte nejefektivnější způsob převodu z první reprezentace do druhé. Určete časovou složitost převodu. 2. (Obrácení hran v orientovaném grafu) ostanete orientovaný graf reprezentovaný maticí sousednosti. Obrátit všechny šipky na druhou stranu je jednoduché, stačí vzít matici transponovanou T. Matice transponovaná k matici = (a i,j ) je matice T = (a j,i ) (prohodíme řádky za sloupce a naopak). le co když dostaneme graf reprezentovaný seznamem sousedů? Jak rychle obrátíte hrany v této reprezentaci? 3. (Mocnina orientovaného grafu) Mocnina orientovaného grafu G = (V, ) je graf G 2 = (V, 2 ), kde uv 2 právě tehdy když z u vede orientovaná cesta délky 2 do v (neboli existuje vrchol w V takový, že uw a wv ). Navrhněte efektivní algoritmus, který dostane graf G reprezentovaný buď maticí sousednosti nebo seznamem sousedů, a vytvoří graf G 2 reprezentovaný stejným způsobem. Jaká je časová složitost vašeho algoritmu? 4. (Hledání stoku) ostanete orientovaný graf reprezentovaný maticí sousednosti. Většina algoritmů pracujících s maticí sousednosti má časovou složitost alespoň Ω(n 2 ). le jsou i výjimky. (a) Zkuste co nejrychleji najít univerzální stok grafu. Univerzální stok je takový vrchol, do kterého vede n hran ze všech ostatních vrcholů, ale ze kterého nevedou žádné hrany ven. Zvládnete to v čase O(n)? (b) Zkuste co nejrychleji najít stok grafu. Stok je takový vrchol, ze kterého nevedou žádné hrany ven. Jaká bude časová složitost vašeho algoritmu? 5. (a) (Matice incidence) Česky bychom mohli říci matice náležení. Tato matice zachycuje, kdy platí v e pro v V a e. Matice incidence I má velikost n m a je definována jako I = (i v,e ) v V,e, kde { v e i v,e = v e Pro graf G ze začátku kapitoly dostáváme následující matici. I(G) = e e e e e e V každém sloupci jsou právě dvě jedničky, protože každá hrana má právě dva konce. Pokud bychom chtěli takto reprezentovat orientovaný graf, tak musíme jedničku u výchozího vrcholu šipky změnit na mínus jedničku.
.5. PŘÍKLY 5 (b) Matice incidence orientovaného grafu G = V, ) je matice tvaru n m = (b v,e ), kde pokud hrana e vychází z vrcholu v b v,e = pokud hrana e přichází do vrcholu v jinak. Zjistěte, jaký význam mají položky matice T, kde T značí matici transponovanou k matici.