Gráfok 2. Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék szlavi@ludens.elte.hu http://peolpe.inf.elte.hu/szlavi 2000
Tartalom 0 Bevezetés 1 Hagyományos gráfábrázolások 2 A Gráftípus 2.1 Specifikáció 2.2 Megvalósítás 3 A gráfok bejárásának módszerei 3.1 Szélességi 3.2 Mélységi 4 A gráfbejárások alkalmazásai 4.1 Összefüggő-e a gráf? 4.2 A gráf komponensei 4.3 Útkeresés két pont között 2018.12.26. Gráfok 2
Tartalom 4.4 Két pont közötti legrövidebb út 4.5 A legrövidebb út súlyozott gráf esetén 4.6 Páros-e a gráf? 5 A feszítőfák 5.0 Fogalmak 5.1 Feszítőfák generálása 5.2 Minimális feszítőfák generálása 6 Az elérési és a távolsági mátrix meghatározása 6.1 Összefüggőség 6.2 Távolságmátrix súlyozott gráfokra 7 Hálózati folyamok 2018.12.26. Gráfok 2
2 A Gráftípus Madártávlatból: Gráf mint típuskonstrukció 2018.12.26. 2 A Gráftípus Madártávlatból: Gráf mint típuskonstrukció Gráf - Tömb analógia sokaságfélék: azonos típusú elemek együttese tömbelem gráfpont indexelés: indextípus pont/él-típus (?) Ahol a Gráf - Tömb analógia megbomlik: az elemkiválasztás lehetőségei – rákövetkezési reláció egyértelmű többértelmű (lineáris) („élirányította”) abszolút relatív (elemfüggetlen) (elemfüggő) 2018.12.26. Gráfok 2 Gráfok 2
2 A Gráftípus (folytatás) 2018.12.26. 2 A Gráftípus (folytatás) Legáltalánosabb esetben a gráf: típusnégyes Gráf(TÉl:THossz, TPont:TElem) Az elemkiválasztás eszköze Az elemleírás eszköze TÉl/TPont – az él/pont „neve” (direkt hozzáférés eszköze) THossz/TElem – az él/pont jellemzője, „tartalma” TÉl+THossz – a pontok topológiafüggő elérésének eszköze Általánosan működő eszköz; bár a TPont-szerinti is értelmes lehet, ha megvalósítható. 2018.12.26. Gráfok 2 Gráfok 2
2 A Gráftípus (folytatás) Műveletosztályok: Az „egészre” vonatkozók Dinamikusak (végrehajtás közben struktúramódosítók) – pontra (TPont), ill. élre (TÉl): beillesztés, törlés Statikusak (struktúrát nem módosítók) – pontra (TElem), ill. élre (THossz): módosítás, tesztelés, kiválasztás (mozgás) … Megjegyzés: A pontra (élre) vonatkozó dinamikusak memória- kezelési problémákat okoznak! Dinamikus és statikus gráf fogalma... 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) A gráf „működés” közben, egy példa: Gráf(TÉl:THossz, TPont:TElem) Konstans MaxKapuSzám : Egész(50) Típus KapuSorszám = 1..MaxKapuSzám ÁramköriElem= Rekord (tip:(BeKapu,VagyKapu, ÉsKapu,...,KiKapu) áll:Logikai [kimeneti állapot]) Vezeték = 'a'..'z' Ellenállás = Valós Áramkör =Gráf(Vezeték:Ellenállás, KapuSorszám:ÁramköriElem) 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) 2018.12.26. 2 A Gráftípus (folytatás) Kékkel jelöltük az ún. dinamikus Gráftípus műveleteit; statikus Gráf esetén ezekre nincs szükség. A kékség utal a dinamikusság, pontosabban a megvalósítási nehézségek „fokára”. 2.1 Specifikáció 2.1.0 A specifikáció elé …műveletekről már majdnem pontosan… Globálisak (a teljes struktúrára vonatkozók): Üres a struktúrát üresre állítja, vagy üreset hoz létre; Üres?: Igaz, ha a struktúra üres, különben Hamis; Létrehoz: gráfot beolvas (Inputbelsőábrázolás) PontSzám: a pontok száma a gráfban; ÉlSzám: az élek száma a gráfban; KomponensKezdőPont: pont, amelyből egy kompo-nens összes pontja elérhető; KomponensSzám: egy gráf (összefüggő) komponense-inek a száma. Előzetesen: miért is ez a nagy műveletválaszték? Az eddigieknél sokkal összetettebb adatszerkezetről van szó. A hasonlatos műveletekkel (l. a szomszéd pontok kezelésére szolgáló műveleteket) az a célom, hogy a megfelelő ábrázoláshoz legjobban illeszkedően lehessen használni gráfot. Ezekről érdemes elmélázni az egyes műveleteknél! l. komponens 2018.12.26. Gráfok 2 Gráfok 2
2 A Gráftípus (folytatás) Valamelyik „gráfalkatrészre” vonatkozók: Pont: a gráf adottadik pontja (valamilyen belső sorrend szerint); BeFok: egy pontba bevezető élek száma; KiFok: egy pontból kivezető élek száma; Érték: egy pont értéke; PontMódosít: egy pont értékét módosítja; Vanél?: van-e él két pont között; ÉlHossz: egy él hossza; ÉlMódosít: egy él hosszát módosítja; VégPontok: egy él két végpontja. Zölddel jelöltük a „ritka” műveleteket; ezekre nincs szükség, ha a párhuzamos élektől eltekintünk. 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) 2018.12.26. 2 A Gráftípus (folytatás) Struktúramódosítás és „mozgáskoordinálás”: BeillesztPont: új (izolált) pontot illeszt a struktúrához azonosítóval és elemértékkel; TörölPont: megszüntet egy pontot a struktúrában, előfeltétele, hogy izolált pont legyen; Összeköt: két pont között hosszal ellátott élt „teremt” a struktúrában; Elszakít: két pont közötti adott élt „megsemmisít”; VanSzomszédPont?: van-e közvetlenül elérhető pont; SzomszédPontokSzáma: a közvetlenül elérhető pontok száma; SzomszédPont: adottadik közvetlenül elérhető pont; Elgondolkodni a szomszédos pontok ezen operációinak ábrázolástól függő (pl. csúcsmátrix) műveletigényéről… A szomszéd pontok „ponttömbként” kezelése. 2018.12.26. Gráfok 2 Gráfok 2
2 A Gráftípus (folytatás) 2018.12.26. 2 A Gráftípus (folytatás) Az élek listaként kezelése. Az élek listaként kezelése. ElsőSzomszédPont: adott pontból kivezető „első” élen át elérhető pont; KövetkezőSzomszédPont: adott pontból egy adottra következő pont; KiindulóÉlekSzáma: adott pontból kiinduló élek száma, azaz SzomszédPontokSzáma + párhuzamos élek száma; KiindulóÉl: adott pontból kiinduló adottadik él. Megjegyzés: Összefüggő gráfok fölépítése közben is előállhat olyan állapot, amelynél az összefüggőség időlegesen nem teljesül! Ha nincsenek párhuzamos élek, akkor azonos a SzomszédPontokSzáma függvény értékével. Elgondolkodni a szomszédos pontok ezen operációinak ábrázolástól függő (pl. csúcslista) műveletigényéről… 2018.12.26. Gráfok 2 Gráfok 2
2 A Gráftípus (folytatás) Csak egy szűkített gráftípus algebrai leírásának a részletét adjuk meg 2 A Gráftípus (folytatás) 2.1.1 Formális specifikációk Algebrai leírás Nincsenek az éleknek nevük. A pontok sorszámozottak. Típus StatikusGráf(Elem): [Pont,Hossz=Egész] Asszociált műveletek: Létrehoz((Elem)*,(Pont2Hossz)*):Gráf [pontérték-listából és (honnan,hová,hossz)* él-listából felépít] PontSzám,ÉlSzám,KomponensSzám(Gráf):Egész KomponensKezdőPont(Gráf,Egész):Egész {NemDef} Érték(Gráf,Pont):Egész {NemDef} ÉlHossz(Gráf,Pont,Pont):Hossz {NemDef} VanÉl?(Gráf,Pont,Pont):Logikai {NemDef} Összeköt(Gráf,Pont,Pont,Hossz):Gráf Elszakít(Gráf,Pont,Pont):Gráf SzomszédPontokSzáma(Gráf,Pont):Egész {NemDef} SzomszédPont(Gráf,Pont,Egész):Pont {NemDef} … 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) Jelölések: g,g’:Gráf – általában a felső vesszők időbeliségre utalnak e1,e2 ,…,en :Elem p,p’,q,r:Pont h,h’:Hossz pl:(Elem)* [az i. érték tarozik az i. ponthoz] él:(Pont2Hossz)* n:Egész Axiómák: 1º Létrehoz – axióma g=Létrehoz((e1,…,en),()) PontSzám(g)=n ÉlSzám(g)=0 KomponensSzám(g)=n (i,j[1..n]: VanÉl?(g,i,j) ÉlHossz(g,i,j)=+ Érték(g,i)=ei) … 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) (1º Létrehoz – axióma (folytatás)) g=Létrehoz(pl,él) VanÉl?(g,p,q) ÉlHossz(g,p,q)=h g’=Létrehoz(pl,él&(p,q,h)) g=g’ g=Létrehoz(pl,él) VanÉl?(g,p,q) g’=Létrehoz(pl,él&(p,q,h)) ÉlSzám(g’)=ÉlSzám(g)+1 VanÉl?(g’,p,q) KomponensSzám(g’) [KomponensSzám(g)-1..KomponensSzám(g)] KomponensSzám(g’)=KomponensSzám(g) KomponensKezdőPont(g’,i)=KomponensKezdőPont(g,i) i[1..KomponensSzám(g)] KomponensSzám(g’)=KomponensSzám(g)-1 i,j[1..KomponensSzám(g)]: KomponensKezdőPont(g,i)=r KomponensKezdőPont(g,j)=q VanÚt?(g’,r,p) k[j+1..KomponensSzám(g)]: KomponensKezdőPont(g’,k-1)= KomponensKezdőPont(g,k) VanÚt? definiálandó! r p q … i. komponens j. komponens 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) 1’º Létrehoz – hiba-axióma pl=(e1,…,en) él’=él&(p,q,h)&él” p,qpl [(p,q,h) nem létező végpontú él] Létrehoz(pl,él’)=NemDef … 2º Összeköt – axióma Összeköt(g,p,q,h)=g’ VanÉl?(g,p,q) ÉlSzám(g’)=ÉlSzám(g)+1 VanÉl?(g’,p,q) ÉlHossz(q’,p,q)=h … 2’º Összeköt – hiba-axióma … hf … 3º Elszakít – axióma Szétszakít(g,p,q)=g’ VanÉl?(g,p,q) ÉlSzám(g’)=ÉlSzám(g)-1 … 3’º Elszakít – hiba-axióma … hf … 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) Exportmodul A gráf statikus értelmezése esetén vagy fölösleges vagy konstans értékű operációk. ExportModul Gráf(Típus TÉl : Típus THossz, Típus TPont: Típus TElem): Eljárás Üres(Változó g:Gráf) Létrehoz(Változó f:InputSzövegFile [listák] g:Gráf) Függvény Üres?(Konstans g:Gráf):Logikai Függvény PontSzám(Konstans g:Gráf):NNEgész Pont(Konstans g:Gráf,i:NNEgész):TPont ÉlSzám(Konstans g:Gráf):NNEgész KomponensSzám(Konstans g:Gráf):NNEgész KomponensKezdőPont(Konstans g:Gráf, i:NNEgész):TPont NNEgész=Nem Negatív Egész 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) BeFok(Konstans g:Gráf, p:TPont):NNEgész KiFok(Konstans g:Gráf, p:TPont):NNEgész Függvény Érték(Konstans g:Gráf,p:TPont):TElem ÉlHossz(Konstans g:Gráf,é:TÉl):THossz VanÉl?(Konstans g:Gráf,p,q:TPont):Logikai Eljárás PontMódosít(Változó g:Gráf, Konstans p:TPont,e:TElem) ÉlMódosít(Változó g:Gráf, Konstans é:TÉl, h:THossz) VégPontok(Konstans g:Gráf,e:TÉl, Változó ból,ba:TPont) Eljárás BeillesztPont(Változó g:Gráf, Konstans p:TPont,e:TElem) TörölPont(Változó g:Gráf, Konstans p:TPont) 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) Eljárás Összeköt(Változó g:Gráf, Konstans é:TÉl, h:THossz, p,q:TPont) Elszakít(Változó g:Gráf, Konstans p,q:TPont) Elszakít(Változó g:Gráf, Konstans é:TÉl) 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) Függvény VanSzomszédPont?(Konstans g:Gráf, p:TPont):Logikai SzomszédPontokSzáma(Konstans g:Gráf, p:TPont):NNEgész SzomszédPont(Konstans g:Gráf, p:TPont,pontsorsz:NNEgész):TPont ElsőSzomszédPont(Konstans g:Gráf, p:TPont):TPont KövetkezőSzomszédPont(Konstans g:Gráf, minek,mireKöv:TPont):TPont KiindulóÉl(Konstans g:Gráf, p:TPont, élsorsz:NNEgész):TÉl KiindulóÉlekSzáma(Konstans g:Gráf, p:TPont):NNEgész Modul vége. 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) Konstans MaxKapuSzám : Egész(50) Típus KapuSorszám = 1..MaxKapuSzám ÁramköriElem= Rekord (tip:(BeKapu,VagyKapu, ÉsKapu,...,KiKapu) áll:Logikai [kimeneti állapot]) Vezeték = 'a'..'z' Ellenállás = Valós Áramkör =Gráf(Vezeték:Ellenállás, KapuSorszám:ÁramköriElem) A Gráftípus „működés közben” (példafolytatás): Változó g :Áramkör [l. típusok] k :ÁramköriElem drót:Vezeték Üres(g) k:=ÁramköriElem(BeKapu,Igaz) BeillesztPont(g,1,k) BeillesztPont(g,2,k) k:=ÁramköriElem(ÉsKapu,Igaz) BeillesztPont(g,3,k) k:=ÁramköriElem(KiKapu,Igaz) BeillesztPont(g,4,k) Összeköt(g,'a',1,3,0) Összeköt(g,'b',2,3,0) Összeköt(g,'c',3,4,0) 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) 2.2 Megvalósítás Érdekes reprezentációk: csúcsmátrix, szomszédsági lista egy speciális mutatós ábrázolás 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) 2018.12.26. 2 A Gráftípus (folytatás) „Valódi” típusparaméterek. Csúcsmátrix: Konstans MaxPont=??? Típus TPont=1..MaxPont TElem= THossz= TÉl= - Reprezentáció Típus PontLeírás=TElem Pontok=Tömb(TPont:PontLeírás) ÉlLeírás=THossz vagy Logikai Élek=Tömb(TPont,TPont:ÉlLeírás) Gráf=Rekord(pont:Pontok,él:Élek) Persze ebbe az ábrázolásba is beépíthető a TÉl típus, azaz a élekhez azonosító rendelhető: ÉlLeírás = Rekord(azon:TÉL,hossz:THossz vagy Logikai) Gráf=Tömb(TPont,TPont:ÉlLeírás) 2018.12.26. Gráfok 2 Gráfok 2
2 A Gráftípus (folytatás) 2018.12.26. 2 A Gráftípus (folytatás) „Valódi” típusparaméterek. Szomszédsági lista: Konstans MaxPont=??? Típus TPont=1..MaxPont TElem= THossz= TÉl= - Reprezentáció Típus SzomszédLista=Lista(TPont) vagy élhosszúságok esetén Él=Rekord(pont:TPont,hossz:THossz) SzomszédLista=Lista(Él) Gráf=Tömb(TPont:SzomszédLista) Persze ebbe az ábrázolásba is beépíthető a TÉl típus, azaz a élekhez azonosító rendelhető: Él = Rekord(azon:TÉL, pont:TPont, hossz:THossz) 2018.12.26. Gráfok 2 Gráfok 2
2 A Gráftípus (folytatás) Mutatós ábrázolás: Lényeg: „páros gráf”, amelynek felváltva mutogatnak egymásra az eredeti gráf pontjai és élei. 2018.12.26. Gráfok 2
2 A Gráftípus (folytatás) 2018.12.26. 2 A Gráftípus (folytatás) „Valódi” típusparaméterek. Típus TPont= TElem= THossz= TÉl= Reprezentáció Típus PontSorozat=AbsztraktSorozat(TPont) ÉlSorozat=AbsztraktSorozat(TÉl) PontLeírás=Rekord( név:TPont,ért:TElem, él:ÉlSorozat [kimenő élek]) ÉlLeírás=Rekord( név:TÉl,hossz:THossz, kpont:TPont [kezdőpont], vpont:TPont [végpont]) Absztrakt sorozat a string típus általánosítása, amelyben a bázís típus (jel helyett) tetszőleges típus lehet. 2018.12.26. Gráfok 2 Gráfok 2
2 A Gráftípus (folytatás) Gráf=Rekord( pontok:AbsztraktSorozat(PontLeírás) élek :AbsztraktSorozat(ÉlLeírás)) vagy Gráf=Rekord( pontok:AbsztraktSorozat(PontLeírás) élek :AbsztraktSorozat(ÉlLeírás) komponenskezdőpontok:PontSorozat) 2018.12.26. Gráfok 2