Sunteți pe pagina 1din 4

FMI Algoritmica grafurilor, anul 1, Laborator

Probleme

1. (3p) Dat un graf orientat ponderat (cu ponderi nenegative) i un vrf s,
determinai distanele de la vrful s la toate celelalte vrfuri (algoritmul lui
Dijkstra). n plus, pentru un vrf dat t, afiai un drum minim de la s la t
(O(m log(n))). http://infoarena.ro/problema/dijkstra

2. (6p) Dat un graf bipartit (neponderat), s se determine un cuplaj perfect al su,
dac exist - folosind algoritmul ungar (cu lanuri M-alternante deschise)-
O(nm).

3. (6p) Algoritmul Ford-Fulkerson de determinare a unui flux maxim ntr-o reea de
transport. http://www.infoarena.ro/problema/maxflow


Drumuri minime de surs unic - Algoritmul lui Dijkstra

Context: G = (V, A) - graf ponderat (orientat), w : A R
+
funcia pondere (numit i
funcie cost), s V un vrf surs
Lungimea (costul) unui drum = suma ponderilor arcelor care l compun
Distana ntre dou vrfuri x i y = lungimea minim a unui x-y drum

Cerin: determinarea distanelor (i drumurilor minime) de la vrful surs s la toate
celelalte vrfuri

Ideea algoritmului lui Dijkstra: La fiecare pas este selectat un vrf u care nu a mai fost
selectat anterior i care pare cel mai apropiat de s i se ncearc mbuntirea
drumurilor determinate pn la acest moment cu ajutorul vrfului u, folosind o tehnic
numit relaxare a arcelor care ies din u. Vrfurile selectate formeaz un arbore cu
rdcina s.
Pentru a determina vrful care pare cel mai apropiat de s, se asociaz fiecrui
vrf o etichet de distan care estimeaz distana (minim) de la s la acel vrf. Mai
exact, pentru un vrf u eticheta sa, notat d[u], are semnificaia:
d[u] = ponderea drumului minim descoperit pn la acel moment.
d[u] va fi o margine superioar a distanei de la s la u.

Pentru a putea reconstitui i un drum minim se va folosi o legtur de tip predecesor
(tat n arborele distanelor vrfului s), notat cu p.

n procesul de relaxare a unui arc (u, v) se verific dac distana de la s la v
determinat pn la acel moment (d[v]) poate fi mbuntit trecnd prin vrful u. Mai
exact, procedura de relaxare a arcului poate fi scris sub forma
FMI Algoritmica grafurilor, anul 1, Laborator

if d[v] > d[u] + w[u,v] then
d[v] d[u] + w[u,v];
p[v] u;
endif

Iniial d[u] este + pentru orice vrf u diferit de s (nu se cunoate nc nici un
drum de la s la u), iar d[s] este 0; predecesorul fiecrui vrf va fi 0.

n timpul execuiei algoritmului toate vrfurile neselectate (care nu sunt n
arborele construit) se afl ntr-o structur Q (care poate fi de exemplu un ansamblu bazat
pe eticheta d).
Funcia extrageMinim (Q) extrage din Q vrful cu etichet minim i l
returneaz.
T = V-Q va fi mulimea vrfurilor care au fost deja prelucrate, iar eticheta d a lor
reprezint chiar distana dorit. Algoritmul Dijkstra n pseudocod este urmtorul:

procedure Dijkstra(G, w, s)

creare(Q, V[G])
pentru fiecare u Q executa
d[u] = ; p[u] = 0

d[s] = 0
cat timp Q executa
u = extrageMinim(Q)
pentru fiecare v Adj[u] executa /*relaxarea arcelor*/
daca v Q si d[u]+w(u, v)<d[v] atunci
p[v] = u
d[v] = d[u]+w(u, v)
/*actualizare(Q)-daca structura pentru Q
necesita reactualizare, cum este n cazul ansamblului*/


Complexitatea algoritmului Dijkstra

T(n, m) complexitate(creare(Q, V[G]))+
+ ncomplexitate(extrageMinim(Q))+
+ mcomplexitate(actualizare(Q))

Complexitatea difer n funcie de structura aleas pentru Q.
Folosind chiar vectorul de distane d pentru extragerea minimului obinem complexitatea
O(n
2
). Folosind ansamblu (heap) pentru Q obinem O(m log n).

Observaii:
a) Se poate demonstra c, atunci cnd un vrf u este selectat (la operaia (1)), d[u]
este chiar distana de la s la u.
b) Algoritmul lui Dijkstra poate fi folosit i la determinarea distanei ntre dou
vrfuri date, s i t; algoritmul se va opri n acest caz cnd este selectat vrful t


FMI Algoritmica grafurilor, anul 1, Laborator
Exemplu

Dorim s determinm distanele
de la vrful 1 la celelalte vrfuri.

Evoluia vectorilor d i p este
ilustrat n tabelul urmtor (cu *
vom marca etichetele vrfurilor
selectate)



Vrfuri
d/p 1 2 3 4 5 6 7
Iniial 0 / 0 / 0 / 0 / 0 / 0 / 0 / 0
Selectat: 1, d[1]=0 0* / 0 1 / 1 / 0 / 0 40 / 1 4 / 1 / 0
Selectat: 2, d[2]=1 0* / 0 1* / 1 3 / 2 / 0 31 / 2 4 / 1 / 0
Selectat: 3, d[3]=3 0* / 0 1* / 1 3* / 2 4 / 3 31 / 2 4 / 1 / 0
Selectat: 6, d[6]=4 0* / 0 1* / 1 3* / 2 4 / 3 31 / 2 4* / 1 13 / 6
Selectat: 4, d[4]=4 0* / 0 1* / 1 3* / 2 4* / 3 6 / 4 4* / 1 10 / 4
Selectat: 5, d[5]=6 0* / 0 1* / 1 3* / 2 4* / 3 6* / 4 4* / 1 10 / 4
Selectat: 7, d[7]=10 0* / 0 1* / 1 3* / 2 4* / 3 6* / 4 4* / 1 10* / 4

Un drum minim de la 1 la 7 poate fi determinat folosind legtura p: p[7] = 4, p[4] = 3,
p[3] = 2, p[2] = 1. Obinem astfel drumul 1, 2, 3, 4, 7

Cuplaje. Algoritmul Ungar (v. curs)
Fie G = (A B, E) un graf bipartit cu |A| = |B|. Algoritmul ungar determin, dac exist,
un cuplaj perfect n G.
Pasul 0. Fie M un cuplaj arbitrar n G (poate fi vid, o muchie )
Pasul 1. Dac M satureaz toate vrfurile din A, atunci M este cuplaj perfect. STOP.
Altfel fie a un vrf nesaturat din A. Construim un arbore M-alternant T cu rdcina n a
Considerm T := (X Y, E(T)), cu X := {a}, Y := , E(T) := , .
Pasul 2. Dac N
G
(X) = Y, atunci nu exist cuplaj perfect (conform teoremei lui Hall).
STOP.
Altfel fie b un vrf din N
G
(X) Y; atunci exist a' X adiacent cu b.
Pasul 3. Dac b este M-saturat, fie a'' vrful din X cu ba'' M.
X := X {a''}, Y := Y {b}, E(T) := E(T) {a'b, ba''}.
Mergi la Pasul 2.
Dac b este M-nesaturat, fie P' a,a lanul din T i P lanul obinut din P'
adugnd muchia a'b. M := M E(P) (operaia de transfer). Mergi la Pasul 1.
1
2
3 4
7
6
5
1
2
1
6
9
4
0
30
4
1
5
1
2
FMI Algoritmica grafurilor, anul 1, Laborator
Exerciiu:

Determinai un cuplaj perfect pentru graful urmtor, folosind algoritmul ungar.
x
2
x
1
x
4
x
3
x
5
y
2
y
1
y
4
y
3
y
5

S-ar putea să vă placă și