Download as pdf or txt
Download as pdf or txt
You are on page 1of 17

EDA

Grafoak

Bertol Arrieta eta Koldo Gojenola


Lengoaia eta sistema informatikoak
UPV-EHU

Jesús Bermudez-en gardenkietan oinarrituta


Eta haren Creative Commons baimenekin
zabaldua
EDA

Zer da grafo bat?

 G=(N, A)
– N adabegien multzo bat da (edo erpinak)
– A arkuen multzoa (adabegi bikotez adieraziak)

A C A C

E E

B D B D
{A, C} {B, C} (A, C) (C, B)
{A, B} {D, B} (A, B) (B, D)
EZ zuzendua {A, E} {E, D} zuzendua (E, A) (D, E)

Grafoak/Grafos 2
EDA

Zenbait kontzeptu

 Auzokidetasuna: bi adabegiren artean


auzokidetasun erlazioa dagoela esango
dugu, baldin eta bi adabegi horiek lotzen
dituen arkurik badago.
 Ibilbidea: grafoko bi adabegi lotzen dituen
arkuen sekuentzia bat da.
 Zikloa: hasten den adabegi berean
bukatzen den ibilbidea da, non ez baita
arkurik errepikatzen.

Grafoak/Grafos 3
EDA

Zenbait kontzeptu

 Grafoak vs zuhaitzak: grafoa zuhaitza baino


kontzeptu orokorragoa da, ez baita kontuan
hartzen zuhaitzen murriztapen hau:
– Adabegi bakoitzak aita bakarra du (erroak izan ezik,
zeinak ez baitu aitarik)
 Grafoetan ez dago errorik, eta adabegi bakoitza
konektatua egon daiteke gainontzeko n-1
adabegietara (gehienez).
 Grafo bat osoa dela esaten da adabegiak
konektatzen dituzten arkuen kopurua maximoa
baldin bada.

Grafoak/Grafos 4
EDA

Grafoen adierazpideak

 Auzokidetasun-zerrendak
A B C D E A B C D E

C A A B A B D B E A

B C B E D C

E D

Grafoak/Grafos 5
EDA

Grafoen adierazpideak

 Auzokidetasun-matrizeak
A B C D E A B C D E
A 0 1 1 0 1 A 0 1 1 0 0
B 1 0 1 1 0 B 0 0 0 1 0
C 1 1 0 0 0 C 0 1 0 0 0
D 0 1 0 0 1 D 0 0 0 0 1

E 1 0 0 1 0 E 1 0 0 0 0

Grafoak/Grafos 6
EDA

Zabalerako ibilbidea

Zuhaitzen mailakako
ibilbidearen tankerakoa

Grafoak/Grafos 7
EDA

Zabalerako ibilbidea
Proc ZabalerakoIbilbidea (G = (N, A))
for n bakoitzeko in N loop
marka(n) ← false
for n bakoitzeko in N loop
If not(marka(n)) then MarkatuZabaleran(n)

Proc MarkatuZabaleran (Nodo v)


I ← new Ilara
marka(v) ← true
I.insert(v)
while not I.isEmpty() loop
lag ← I.removeFirst()
for w in N lag-en auzokide bakoitzeko loop
If not marka(w) then
marka(w) ← true
I.insert(w)

Grafoak/Grafos 8
EDA

Afaria, biltzarrean (1)


func Biltzarra (G=(N,A)) return boolean
posibleDa ← true // hasierako balioa
for n bakoitzeko in N loop
marka(n) ← false
for n bakoitzeko in N loop
if not marka(n) then
JatetxeaMarkatu(n, true, posibleDa)
if not posibleDa then
return false

Adibidea: afaria, biltzarrean. Biltzar batean, afari bat


antolatu behar dute, eta bi jangela dituzte horretarako.
Partehartzaile asko haserretuta daude, eta ez dute jangela
berean egon nahi. Posible al da partehartzaileak bi jangela
horietan banatzea, haserre daudenak jangela desberdinetan
jarrita?
Grafoak/Grafos 9
EDA

Afaria, biltzarrean (2)


proc JatetxeaMarkatu(Nodo v, boolean aukera, boolean emaitza)
I ← IlaraHutsaSortu()
marka(v) ← true
jangela(v) ← aukera
I.gehitu(v)
while not I.hutsaDa() loop
u ← I.removeFirst()
for w in N u-ren auzokide bakoitzeko loop
If not marka(w) then
marka(w) ← true
jangela(w) ← not jangela(u) // u-ren jangelaren kontrakoa jarri w-ri
I.gehitu(w)
else // w markatuta dago, eta esleituta du beraz jangela bat
If (jangela(u) = jangela(w)) then
emaitza ← false
exit
// honaino iristen bada begizta guztiak bukatuta, emaitza aldagaian true itzuliko da
emaitza ← true

Grafoak/Grafos 10
EDA

Sakonerako ibilbidea

Grafoak/Grafos 11
EDA

Sakonerako ibilbidea
Proc SakonerakoIbilbidea (G = (N, A))
for n bakoitzeko in N loop
marka(n) ← false
for n bakoitzeko in N loop
If not(marka(n)) then MarkatuSakoneran(n)

Proc MarkatuSakoneran(Nodo v)
marka(v) ← true
for w in N v-ren auzokide bakoitzeko loop
If not(marka(w)) then MarkatuSakoneran(w)

Ariketa: 8. gardenkiko algoritmoan zein


aldaketa SOTIL egingo zenuke, sakonerako
ibilbide hau lortzeko

Grafoak/Grafos 12
EDA
Sakonerako ibilbidea
(eskema orokorra)

proc MarkatuSakoneranGen(Nodo v)
// prozesatu v, lehen bisitan (aurreordenan bezala)
marka(v) ← true
for w in N v-ren auzokide bakoitzeko loop
// (v,w) arkua prozesatu
If not(marka(w)) then
// (v,w) arkua prozesatu
MarkatuSakoneranGen(w)
// w prozesatu ondoren, v prozesatu (inordenan bezala)
else
// (v,w) arkua prozesatu
end for
// v prozesatu, uzterakoan (postordenan bezala)

Grafoak/Grafos 13
EDA
Zabalerako eta sakonerako
ibilbideen analisia
 Izanik n grafoko adabegien kopurua eta a
arkuen kopurua:
– O(n+a) baldin eta grafoa auzokidetasun
listekin adierazten bada.
– O(n2) baldin eta grafoa auzokidetasun
matrizeekin adierazten bada.

Grafoak/Grafos 14
EDA

Ordenazio topologikoa
G= (N,A) zuzendutako grafo ez-zikliko baten ordenazio topologikoak berekin
dakar grafoko adabegien lista bat, non A-ko (u,v) arku bakoitzerako u adabegia
v adabegiaren aurretik agertuko den emaitzako listan.

Adibideko grafoaren zenbait ordenazio topologiko:


ABEDFCHIG
AEBDFGHCI

Grafoak/Grafos 15
EDA

Ordenazio topologikoa
func OrdenazioTopologikoa (G=(N,A)) return NodoenLista
L ← new Lista
for n bakoitzeko in N loop
marka(n) ← false
for n bakoitzeko in N loop
If not(marka(n)) then OrdenTopo(n, L)
return L

proc OrdenTopo(Nodo v, NodoenLista List)


marka(v) ← true
for w in N v-ren auzokide bakoitzeko loop
If not(marka(w)) then OrdenTopo(w,List)
end for
List.addFirst(v)

Grafoak/Grafos 16
EDA

Irakurgaiak

 Barne-txostena:
– “Recorridos de grafos: Teoría y aplicaciones”
Jesús Bermúdez de Andrés
 [Lewis, Chase 2006]
– 18. kapitulua

Grafoak/Grafos 17

You might also like