TI 3.1 UPOZORNĚNÍ Reprezentace grafů, odst. 4.1 dne (za týden) bude X36TIN dvakrát dne (za 5 týdnů) bude X36OSY dvakrát skripta X36TIN jsou v prodeji na katedře, místnost K326
TI 3.2 REPREZENTACE GRAFŮ maticové spojové další... Reprezentace grafů, odst. 4.1 V této části se seznámíme s pojmy: matice incidence NG/OG, matice sousednosti NG/OG (základní) spojová reprezentace NG/OG Skripta odstavec 4.1, str
TI 3.3 Matice incidence NG A = [ a ik ] obdélníková matice typu |U| x |H| nad tělesem mod 2 (pozor na základní operace!) hrana h k inciduje s uzlem u i a ik = jinak adebc a b c d e ? Co nám říká matice incidence o grafu ? ? Smyčky, rovnoběžné hrany ? Reprezentace grafů, odst. 4.1
TI 3.4 Poznáme podle matic incidence, zda jsou dva grafy izomorfní? Např.: G 1 G 2 ?? právě když ??A 1 A 2 Zjištění: součet (mod 2) ve sloupci je 0 (vždy dvě jedničky!) řádky jsou lineárně závislé, takže hodnost matice A... h(A) |U| - 1 (rovnost platí pro souvislé grafy) h(A) = |U| - p obecný vztah pro graf s p komponentami Reprezentace grafů, odst. 4.1
TI 3.5 Matice sousednosti NG V = [ v ij ] čtvercová matice typu |U| x |U| nad okruhem celých čísel: v ij = počet hran mezi uzly u i a u j adebc a b c d e a b c d e ? Co nám říká matice sousednosti o grafu ? ? Smyčky, rovnoběžné hrany ? Reprezentace grafů, odst. 4.1
TI 3.6 Poznáme podle matic incidence, zda jsou dva grafy izomorfní? Např.: G 1 G 2 ?? právě když ??V 1 V 2 Zjištění: V = V T V r = [v ik (r) ]... počet sledů délky r mezi u i a u k A. A T = V + D, D = [ d ii ], kde d ii = (u i ) Reprezentace grafů, odst. 4.1
TI 3.7 Matice incidence OG A = [ a ik ] obdélníková matice typu |U| x |H| nad okruhem celých čísel: 1... hrana h k vychází z uzlu u i a ik =-1... hrana h k končí v uzlu u i 0... jinak adebc a b c d e Vlastnosti podobné jako pro NG Reprezentace grafů, odst. 4.1
TI 3.8 Matice sousednosti OG V = [ v ij ] čtvercová matice typu |U| x |U| nad okruhem celých čísel: v ij = počet hran z uzlu u i do uzlu u j adebc a b c d e a b c d e ? Poznáme izomorfní orientované grafy ? ? V = V T ? a b c d e a b c d e Reprezentace grafů, odst. 4.1
TI 3.9 Zjištění: V r = [v ik (r) ]... počet spojení délky r z u i do u k V* = V i, i=0,... d, kde d = min(|H|, |U|-1) ?? Co asi říká o grafu tato matice V* ?? A. A T = D - V - V T, D = [ d ii ], kde d ii = + (u i )+ - (u i ) Reprezentace grafů, odst. 4.1
TI 3.10 Spojová reprezentace grafu |U | NG - seznamy sousedů OG - seznamy následníků Adj[u]: Srovnání paměťové složitosti: NG A: |U|.|H| (bitů!) V: |U|.|U| (integer ? Boolean) Adj: |U| + 2.|H| OG Adj: |U|+|H| Reprezentace grafů, odst. 4.1
TI 3.11 Základní spojovou reprezentaci mohou ještě doplňovat: seznamy předchůdců uzlů (pro OG) u každého prvku v seznamu následníků/předchůdců lze uvést i odpovídající označení (číslo) hrany přiřazení dvojic (uspořádaných dvojic) uzlů hranám ( a ) ohodnocení/označení uzlů a/nebo hran atd. Reprezentace grafů, odst. 4.1 Místo spojové reprezentace seznamů následníků/předchůdců je též možno použít např. uložení v poli:
TI 3.12 Reprezentace grafů, odst. 4.1 Až dosud jsme měli na mysli vnitřní reprezentaci grafů, ale jsou také různé vnější reprezentace, jimiž lze zadat graf na vstupu nějakého programu, např.: // počet uzlů a hran 5 7 // hrany jako dvojice uzlů Zkuste vymyslet další možnosti...
TI 3.13 Vlastní reprezentaci mohou mít některé speciální typy grafů, jako např.: kořenové stromy pravidelné stromy atd. Tím se budeme zabývat později... Reprezentace grafů, odst. 4.1
TI 3.14 Kontrolní otázky 1.Jak se z matice incidence neorientovaného grafu určí množina sousedů zadaného uzlu? Jaká bude časová složitost této operace? 2.Jak se z matice incidence orientovaného grafu určí množina předchůdců zadaného uzlu? Jaká bude časová složitost této operace? 3.Přesně popište, jaký bude vztah matice sousednosti (obecného) neorientovaného grafu G a matice sousednosti grafu G', který vznikl nějakou orientací hran grafu G. 4.V jakém orientovaném grafu bude r-tá mocnina V r matice sousednosti V obsahovat počty různých orientovaných cest mezi jednotlivými uzly ? 5.Jak se z matice sousednosti neorientovaného grafu určí množina sousedů zadaného uzlu? Jaká bude časová složitost této operace? 6.Jak se z matice sousednosti orientovaného grafu určí množina předchůdců zadaného uzlu? Jaká bude časová složitost této operace? 7.Navrhněte algoritmus převodu matice incidence A neorientovaného grafu na jeho matici sousednosti V. 8.Navrhněte algoritmus převodu matice sousednosti V orientovaného grafu na jeho matici incidence A. Reprezentace grafů, odst. 4.1
TI 3.15 Prohledávání grafů V této části se seznámíme s pojmy: prohledání grafu do šířky (BFS), strom prohledání do šířky (BF-strom), časová složitost prohledání do šířky, rozklad neorientovaného grafu na komponenty prohledání grafu do hloubky (DFS), strom prohledání do hloubky (DF-strom), časové značky uzlů, časová složitost prohledání do hloubky algoritmus topologického uspořádání uzlů algoritmus určení silných komponent orientovaného grafu Skripta odstavec 4.2, str Prohledávání grafů, odst. 4.2
TI 3.16 Prohledávání grafu do šířky BFS - Breadth-First Search Je zadán graf G = H,U, (není podstatné, zda NG nebo OG) a jeho uzel s U. Prohledáním do šířky dostaneme strom (nejkratších) s u cest pro všechny uzly u dostupné z uzlu s (BF-strom) Stavy uzlů: FRESH - nový (dosud neobjevený) uzel OPEN - právě objevený („nadějný“) uzel CLOSED - vyčerpaný uzel Prohledávání do šířky - odst. 4.2
TI Prohledávání do šířky - odst. 4.2
TI 3.18 Použité datové struktury: stav[u] - FRESH / OPEN / CLOSED d[u] - zjištěná vzdálenost s u p[u] - předchůdce uzlu u (viz ) fronta - OPEN uzly s u v d[u]=k d[v]=k+1 p[v]=u Průběh prohledávání do šířky Prohledávání do šířky - odst. 4.2
TI 3.19 BFS (G, s)... pseudokód 1for každý uzel u U-s 2{ stav[u] FRESH; d[u] ; p[u] nil } 3stav[s] OPEN; d[s] 0; p[s] nil; 4InitQueue; Enqueue(s); 5while not EmptyQueue { 6u QueueFirst; 7for každé v Adj[u] { 8 if stav[v]=FRESH { 9 stav[v] OPEN; d[v] d[u]+1; 10 p[v] u; Enqueue(v); } 11} 12 Dequeue; 13stav[u]:=CLOSED 14 } Prohledávání do šířky - odst. 4.2
TI Prohledávání do šířky - odst
TI 3.21 Jak je BFS složitý ? cykl ř. 1 a 2... |U| operace s frontou O(1) na uzel celkem O(|U|) cykly a 7-11 pro každého souseda O(|H|) O(|U| + |H|) Zjištění: pokud fronta obsahuje uzly v 1, v 2,..., v r, potom platí d[v r ] d[v 1 ] + 1 d[v i ] d[v i+1 ] pro i=1,2,...,r-1 BFS nalezne nejkratší s v cestu pro každý uzel v dosažitelný z uzlu s a (p[v],v) určuje její poslední hranu všechny tyto hrany tvoří tzv. BF-strom Prohledávání do šířky - odst. 4.2
TI 3.22 Kontrolní otázky 1.Změní se nějak chování či výsledek algoritmu BFS, pokud příkazy na řádcích 12 a 13 umístíme bezprostředně za řádek 6? 2.Jak bude výsledek algoritmu BFS (tzn. vytvořený BFS-strom a hodnoty d[u]) ovlivněn změnou pořadí uzlů v seznamech sousedů ? 3.Změní se nějak složitost algoritmu BFS, pokud namísto spojové reprezentace použijeme k vyjádření struktury grafu jeho matici incidence A (resp. matici sousednosti V) ? 4.Zdůvodněte, proč nelze následující strom T získat jako BFS-strom při prohledání grafu G do šířky pro žádné uspořádání uzlů v seznamech sousedů uzlů, přestože strom T představuje jeden z možných stromů nejkratších cest z uzlu s do všech ostatních uzlů. GT s s 5.Jak vypadá neorientovaný graf, jehož BFS strom má při libovolném uspořádání uzlů v seznamu sousedů tvar hvězdice ? 6.Upravte algoritmus BFS tak, aby určoval počet a strukturu komponent neorientovaného grafu. Prohledávání do šířky - odst. 4.2
TI 3.23 Prohledávání grafu do hloubky Základní princip DFS : postupuje se stále dál od počátečního uzlu dosud neprozkoumaným směrem. Když už to dál nejde, vrátíme se a postupujeme zase co nejdál. Prohledávání do hloubky - odst. 4.2 Pro jednoduchost předpokládáme, že sousedi jsou řazeni v pořadí rostoucích pořadových čísel uzlů
TI Prohledávání do šířky - odst
TI 3.25 DFS - Depth-First Search Výsledkem bude DF-strom (nebo les) Uzly jsou opět FRESH, OPEN nebo CLOSED, ale mají časové značky s hodnotami 1 … 2*|U| – d[u] přidělí se při otevření uzlu – f[u] přidělí se při uzavření uzlu (tzn. d[u]<f[u]) Jak budeme DFS implementovat ? Prohledávání do hloubky - odst. 4.2
TI 3.26 DFS (G)... pseudokód 1for každý uzel u U 2 { stav[u] FRESH; p[u] nil; } 3i 0; 4 for každý uzel u U 5 { if stav[u] = FRESH { DFS-Projdi(u); } } DFS-Projdi(u) 1stav[u] OPEN; i i+1; d[u] i; 2for každý uzel v Adj[u] { 3 if stav[u] = FRESH { 4 p[v] u; DFS-Projdi(v); } } 5stav[u] CLOSED; i i+1; f[u] i; Prohledávání do hloubky - odst. 4.2
TI Prohledávání do hloubky - odst / 2/3/ 4/5/1/185/64/73/82/910/11/ 12/13/ 13/14 12/1511/1610/17 OPEN CLOSED stromovázpětnádopřednápříčná
TI 3.28 Jak je DFS složitý ? v DFS se cykly na ř a 4 – 5 provedou |U|-krát DFS-Projdi se volá |U|-krát cykl v DFS-Projdi na ř. 2-4 se provádí |Adj[u]|-krát dohromady O(|H|) O(|U| + |H|) Prohledávání do hloubky - odst. 4.2
TI 3.29 K čemu je dobré značkování uzlů ? Sledujme stromové hrany: 1/ 2/ 3/4/ 5/ 1/18 5/6 4/73/8 2/9 10/11/ 12/ 13/13/14 12/15 11/1610/17 (1.. 18) (2.. 9) (3.. 8) (4.. 7) (5.. 6) (1.. 18) ( ) ( ) ( ) ( ) Obecně platí: (d[u],f[u]) (d[v],f[v]) = nebo (d[u],f[u]) (d[v],f[v]) nebo (d[v],f[v]) (d[u],f[u]) Prohledávání do hloubky - odst. 4.2
TI / 2/3/ 4/5/1/185/64/73/82/910/11/ 12/13/ 13/14 12/1511/1610/17 zpětná hrana (u,v) vede k OPEN uzlu v dopředná a příčná hrana (u,v) vede ke CLOSED uzlu - dopředná má d[u]<d[v] - příčná má d[u]>d[v] Prohledávání do hloubky - odst. 4.2
TI 3.31 Jak se liší DFS u neorientovaného grafu ? Jsou zde pouze stromové a zpětné hrany ! 1/ 2/ 3/4/ 5/ 1/18 5/14 4/153/16 2/17 10/11/ 12/ 13/9/10 8/11 7/126/ Prohledávání do hloubky - odst. 4.2
TI 3.32 Top-Sort-1 (G) 1)S:= 2)prováděj DFS(G) a v okamžiku f[u] ulož uzel u na začátek seznamu S 3)S obsahuje uzly v topologickém uspořádání V: G je acyklický DFS(G) neobjeví zpětnou hranu Top-Sort-2 (G) eliminací kořenů - viz dříve [u] = - G [u] M - množina kořenů (fronta) Prohledávání do hloubky - odst. 4.2 Topologické uspořádání uzlů pomocí DFS
TI 3.33 Prohledávání do hloubky - odst. 4.2 Silné komponenty pomocí DFS S-COMP (G) 1)pomocí DFS(G) se určí f[u] pro všechny u U 2)vytvoří se G - (opačně orientovaný graf) 3)provede se DFS(G - ) s tím, že uzly v hlavním cyklu se berou v klesajícím pořadí f[u] 4)stromy DF-lesa určují silné komponenty
TI /22 2/21 3/18 4/9 19/20 15/16 10/17 5/8 12/13 11/14 6/7 1/6 3/4 7/12 17/22 2/5 8/11 9/10 19/20 14/15 13/16 18/21 Prohledávání do hloubky - odst. 4.2
TI 3.35 Kontrolní otázky 1.Vysvětlete na příkladu, že je možné, aby uzel u orientovaného grafu skončil při prohledání do hloubky jako jediný uzel nějakého dílčího DF-stromu, přestože do u vcházejí i z něho vycházejí hrany. 2.Navrhněte obecný postup orientace hran neorientovaného grafu, jehož výsledkem bude acyklický orientovaný graf. 3.Upravte algoritmus procházení neorientovaného (resp. orientovaného) grafu do hloubky tak, aby generoval všechny cesty (resp. orientované cesty) vycházející ze zadaného počátečního uzlu s. 4.Navrhněte algoritmus časové složitosti O(|U|+|H|), který pro zadaný acyklický orientovaný graf určí počet (nikoliv nutně strukturu) všech neprázdných orientovaných cest v tomto grafu. 5.Navrhněte algoritmus časové složitosti O(|U|), který zjistí, zda zadaný neorientovaný graf je stromem. Prohledávání do hloubky - odst. 4.2