You are on page 1of 6

Andrés Luengo Blázquez Tema 7 PAED

7. Grafs

7.1 Introducció

Un graf 𝐺 és un conjunt definit com 𝐺 = {𝑉, 𝐸}, on 𝑉 és un conjunt finit de vèrtexs del
graf i 𝐸 és un conjunt d’arestes (edges) del graf. Cada aresta comunica un parell de
vèrtexs (𝑢, 𝑣). L’ordre d’un graf és el número de vèrtex que té, i la mida és el número
d’arestes. Dos vèrtex són adjacents si estan connectats per una aresta (bidireccional).

Els grafs poden ser:

• Dirigits: si en el conjunt de vèrtex (𝑢, 𝑣) d’una aresta, un és destí i l’altre


.......... origen. El número màxim d’arestes que pot tenir és:

𝐸 = 𝑉(𝑉 − 1)

• No dirigits: si en el conjunt de vèrtex (𝑢, 𝑣) d’una aresta, podem anar de


.......... qualsevol a l’altre (bidireccional). El número màxim d’arestes que
........ pot tenir és:

𝑉(𝑉 − 1)
𝐸=
2

Hi ha grafs amb costos o etiquetes, definits com 𝐺 = {𝑉, 𝐸, 𝑊}, on cada vèrtex té un
cost o etiqueta 𝑤.

Graf dirigit Graf no dirigit Graf amb costos

En un graf dirigit, els vèrtex tenen successors 𝑠𝑢𝑐𝑐(𝑣) i predecessors 𝑝𝑟𝑒𝑑(𝑣). El grau
d’entrada 𝑑 7 (𝑣) d’un vèrtex equival al número de successors, i el grau de sortida
𝑑 8 (𝑣)equival al número de predecessors.

El grau total d’un vèrtex és 𝑑(𝑣) = 𝑑 7 (𝑣) −𝑑 8 (𝑣). Lògicament, un graf no dirigit tindrà
un grau total 𝑑(𝑣) = 0, degut a la bidireccionalitat.

Un graf 𝐺′ = {𝑉′, 𝐸′} és un subgraf de 𝐺 = {𝑉, 𝐸}, si 𝑉′ ⊆ 𝑉 i 𝐸′ ⊆ 𝐸.

Un camí es una seqüencia de vèrtexs 〈𝑣= , 𝑣> , … , 𝑣@ 〉. Podem dir que es tracta de un camí
simple si no es repeteix cap vèrtex. També podem dir que es tracta d’un camí tancat si
𝑣= = 𝑣@ , i en cas contrari serà un camí obert.

Un cicle és un camí simple tancat. Si un graf té cicles, diem que és cíclic, si no, direm que
és acíclic.

1
Andrés Luengo Blázquez Tema 7 PAED

• Graf Eulerià: conté un cicle que inclou totes les arestes. Per poder fer-ho, com
......... a màxim pot haver-hi dos vèrtex amb grau senar. En un graf dirigit,
.......... tots els vèrtexs han de tenir grau 0.
• Graf complet: tots els vèrtexs tenen que ser adjacents a la resta de vèrtexs.
• Graf regular: tots els vèrtexs tenen el mateix grau.

Per representar un graf, podem fer-ho de la següent forma:

• Matriu d’adjacències

Consisteix en una matriu 𝐴 amb mida 𝑉𝑥𝑉, on guardem els costos (en cas d’existir)
de connexió entre vèrtexs. Per exemple:

A B C D
A 0 4 11 -1
B 4 0 5 8
C 11 5 0 9
D -1 8 9 0

• Llista d’adjacències

És una manera compacta de representar els grafs. Consisteix en una array 𝐴𝑑𝑗 de
mida 𝑉, on cada posició conté els seus vèrtexs adjacents. Per exemple:

A B C D
B A A B
C C B C
D D

És preferible utilitzar la llista d’adjacències per a grafs dispersos, és a dir, que el número
d’arestes és molt més petit que el número de vèrtexs. Això és degut a que té un millor
cost de memòria.

És preferible utilitzar la matriu d’adjacències per a grafs densos, o si necessitem


comprovar si existeix connexió entre dos vèrtex en cost 𝜃(1). O bé, si no es crític en
termes de memòria.

2
Andrés Luengo Blázquez Tema 7 PAED

7.2 Algorismes sobre grafs

7.2.1 Ordenació topològica

Permet resoldre problemes de dependències, com ara compilació de llibreries, ordre de


tasques a realitzar, diagrames de Gantt...

Únicament es aplicable sobre grafs dirigits acíclics. Sempre comencem a ordenar pels
vèrtexs amb grau d’entrada 0. Interessa conèixer el grau d’entrada de tot els vèrtexs, i
actualitzarem a cada iteració els nous graus d’entrada. Si ho intentem fer sobre un graf
cíclic, arribarà un punt on no tindrem cap vèrtex amb grau d’entrada 0.

Si el graf està representat en matriu d’adjacències, el cost serà quadràtic. Si està


representat en llista d’adjacències, el cost serà lineal.

Exemple:

Iniciació de les variables


A B C D E F
visited = 0 0 0 0 0 0
in_degrees = 0 1 1 3 0 1

path = ø

1ª iteració 4ª iteració

visited = 1 0 0 0 0 0 visited = 1 1 1 0 1 0
in_degrees = 0 0 1 2 0 1 in_degrees = 0 0 0 0 0 1

path = {A} path = {A B C E}

2ª iteració 5ª iteració

visited = 1 1 0 0 0 0 visited = 1 1 1 1 1 0
in_degrees = 0 0 0 1 0 1 in_degrees = 0 0 0 0 0 0

path = {A B} path = {A B C E D}

3ª iteració 6ª iteració

visited = 1 1 1 0 0 0 visited = 1 1 1 1 1 1
in_degrees = 0 0 0 1 0 1 in_degrees = 0 0 0 0 0 0

path = {A B C} path = {A B C E D F}

3
Andrés Luengo Blázquez Tema 7 PAED

7.2.2 DFS (Depth-First Search)

És aplicable a tot tipus de graf. La seva funció és construir un graf acíclic (tipus arbre)
que serveix per obtenir informació del graf i fer comprovacions.

Es tracta d’anar recorrent el graf en ordre, i tornant enrere quan ja no trobem cap nou
vèrtex (no visitat).

Exemple:

Podem reaprofitar el DFS per tal de fer la ordenació topològica (obviàment només en
grafs dirigits acíclics. Hem de fer un DFS marcant als vèrtexs durant el recorregut un
keytime de discovery, i un altre de finished, i previàment ordenar-los per finished
descendentment, per tal d’obtenir l’ordenació topològica.

Exemple:

Ordenació topològica
path = {E F C A B D}

7.2.3 MST (Minimum Spanning Tree)

El seu objectiu és combinar un conjunt d’arestes tal que es connectin tots els vèrtexs i
que la suma del pes d’aquests sigui mínima. És aplicable a grafs no dirigits amb pesos.

Es necessiten un total de 𝐸 = 𝑉 − 1 per tal de poder aconseguir-ho.

Estudiarem dos algorismes que realitzen el MST: Prim i Kruskal. Tot i així, cal esmentar
que per a grafs densos és millor utilitzar Prim.

4
Andrés Luengo Blázquez Tema 7 PAED

a) Prim

Comença per un vèrtex qualsevol. A cada iteració, escull l’aresta amb pes mínim i on
únicament un dels dos vèrtexs de l’aresta hagi estat visitat.

Exemple:

Iniciació de les variables

Q=ø
path = ø

1ª iteració 2ª iteració 3ª iteració


//Comencem per A Q = {a,c,e} Q = {c,d,e}
Q = {b,a} path = {b,a} //no escollim c degut a que
path = {b} //provoca un cicle
path = {b,a,d}

b) Kruskal

Afegim totes les arestes a una cua de prioritats, en ordre de cost ascendent. Creem tants
conjunts inicials com vèrtexs tingui el graf. S’utilitzen els conjunts per tal d’evitar cicles,
ja que només afegirem al conjunt parts dels altres conjunts.

Exemple:

Iniciació de les variables

Q = {b,a,c,d,e}
Conjunts = {A},{B},{C},{D}

1ª iteració 2ª iteració 3ª iteració


Q = {a,c,d,e} Q = {c,d,e} //descartem c ja que no
Conjunts = {AC},{B},{D} Conjunts = {ACB},{D} connecta vèrtexs de
path={b} path={b,a} conjunts diferents
Q = {e}
Conjunts = {ACBD}
path={b,a,d}

5
Andrés Luengo Blázquez Tema 7 PAED

7.2.4 Dijkstra

És aplicable en grafs amb pesos. El seu objectiu és crear un arbre de recorreguts mínims
a partir d’un vèrtex inicial cap a la resta. El pes de tota aresta ha de ser positiu.

Exemple per a vèrtex inicial A:

A la inicialització, creem un array de distàncies, on anirem guardant la distància a cada


iteració fins els diferents vèrtexs. Els que no tinguin connexió directe amb un vèrtex
visitat, tindran una distància tendint a infinit. A un array de camins, guardarem el vèrtex
que ens permet accedir a aquell nou vèrtex. A la cua de prioritats anirem ordenant els
vèrtexs segons la seva distància.

Iniciació de les variables


A B C D E F
distancies = 0 ¥ ¥ ¥ ¥ ¥
paths = A - - - - -

Q= {A, B, C, D, E, F}

1ª iteració //A 4ª iteració //F

distancies = 0 4 10 ¥ ¥ ¥ distancies = 0 4 7 12 16 10
paths = A A A - - - paths = A A B B F B

Q= {B,C,D,E,F} Q= {D,E }

2ª iteració //B 5ª iteració //D

distancies = 0 4 7 12 ¥ 10 distancies = 0 4 7 12 16 10
paths = A A B B - B paths = A A B B F B

Q= {C,F,D,E} Q= {E }

3ª iteració //C 6ª iteració //E

distancies = 0 4 7 12 18 10 distancies = 0 4 7 12 16 10
paths = A A B B C B paths = A A B B F B

Q= {F,D,E } Q= ø

Una vegada la cua està buida, ja tenim els camins per anar des de
A fins a qualsevol altre vèrtex en un cost mínim. Podem interpre-
tar la solució com:

You might also like