Sunteți pe pagina 1din 41

Drumuri in grafuri

Conexitate
Drumuri de cost minim

Drumuri in graf

drum (sau lant pentru graf neorientat)


drum trivial
drum deschis
drum inchis
drum elementar
subdrum

Drumuri in graf
Fie G=(V,E) un graf, u,vV.
Secvenade vrfuri G: u0, u1, ..., un este un u-v drum dacu0=u, un=v,
uiui+1E, 0 i n.

v2

v6

v1

v7

v5

v4
v3

v8

v10

v9
Fig.1 V1-V10 drum

Drum simplu fiecare muchie apare o singura data


Lungimea drumului,notatl(G) esteegalcun.
Convenionalsenumetedrum trivial un drum G cu l(G)=0.
Pentru drumul din figura, l(G) = ?

l(G) = 8

Drumuri in graf
Fie G: u0, u1, ..., un un drum n graful G=(V,E). G este un
drum nchis dacu0=un; n caz contrar G senumete
drum deschis.
v2

v6

v1

v4

v7

v5

v3

v8
v9

Fig.2 Drum inchis

v10

Drumuri in graf
Drumul G este elementar dacoricaredouvrfuridinG
sntdistincte,cuexcepia,eventual,aextremitilor.
v2

v6

v1

v4
v3

v7

v5

v8
v9

Fig.3 Exemplu de drum elementar


(contine doar varfuri distincte)
Drumul G este proces dacpentruorice0 i jn-1 uiui+1 ujuj+1.
Orice drum elementar este un proces.

v10

Drumuri in graf
Fie G: u0, u1, ..., un un drum n graful G=(V,E). G: v0, v1,..,vm este un subdrum
al lui G dacG esteundrumipentruoricej, 0 j m ,existi, astfel nct
ui = vj. Oricedrumculungimecelpuin1coninecelpuinundrum
elementarcuaceleaiextremiti.

v2

v6

v1

v4
v3

v7

v5

v8
v9

Fie drumul G: v1, v2, v4, v5, v3, v1, v2, v5, v6, v7, v8, v9, v5, v9, v8, v10
Atunci

G1: v1, v2, v5, v9, v8, v10


G2: v1, v2, v4, v5, v9, v8, v10

snt v1-v10 subdrumuri elementare.

v10

Drumuri in graf
Exercitiu 1a: fie graful neorientat
Care dintre urmatoarele drumuri
sunt elementare si care nu?
Vf initial = 2
Vf. final = 6

2,4,5,1,6
2,3,6
2,1,6,5
2,4,5,7,3,6

Elementar
Elementar
Neelementar
Neelementar

Drumuri in graf
Exercitiu 1b: fie graful neorientat
Care dintre urmatoarele drumuri
sunt elementare si care nu?
Vf initial = 2
Vf. final = 5

2,4,1,4,6,7,5
2,4,1,6,1,7,5
2,4,6,7,5,1,5
2,5,4,7
2,4,3,6,1,5

Neelementar
Neelementar
Neelementar
Nu e drum
Elementar

Drumuri in graf
Ciclu drum (lant) cu V=v1, v2, .., vn , cu v1=vn si muchiile u1-u2, u2-u3, un-1
un sunt diferite doua cate doua.
Ciclu elementar ciclu in care toate varfurile sunt diferite doua cate doua
mai putin primul si ultimul. In caz contrar, el este neelementar.
Observaie: ntr-ungrafneorientatnoiuniledecircuiticiclu
sunt echivalente.
Exemplu

Ciclu elementar/neelementar?
a) 3,4,5,3,7,1,2,3
b) 2,3,7,6,1,2
Raspuns:
a) ciclu neelementar
b) ciclu elementar

Drumuri in graf
Exercitiu: fie graful neorientat

Dati exemple de cicluri elementare si neelemenare care sa respecte conditiile:


- sa se plece din varful 5
- sa se treaca prin varful 3

Drumuri in graf
Raspuns (exemple de cicluri care sa respecte
conditiile impuse):
ciclu elementar: 5,1,4,3,6,7,5
ciclu neelementar: 5,2,7,1,4,3,6,7,5

Drumuri in graf
Rezumat:

drum ntr-ungraf:omulimeordonatdenodurialegrafului:(x1, x2, ..., xk),cuproprietateac


existngraftoatearceledeforma(xi,xi+1) i = 1,...,k-1;
lungimea unui drum:estenumrularcelorcarelformeaz
drum elementar:undrumncarefiecarenodapareosingurdat
drum simplu:undrumncarefiecarearcapareosingurdat
drum hamiltonian: un drum elementar care trece prin toate nodurile grafului;
drum eulerian:undrumsimplucareconinetoatearcelegrafului
lan:undrumncarearcelenuauneapratacelaisensdeparcurgere
circuit:undrumncarenoduliniialcoincidecucelfinal
circuit elementar:undrumncarefiecarenodapareosingurdat,cuexcepiaceluifinal,care
coincidecuceliniial
circuit simplu:undrumncarefiecarearcapareosingurdat
circuit hamiltonian: un circuit care trece prin toate nodurile grafului;
ciclu:esteuncircuitncarearcelenuauneapratacelaisensdeparcurgere
ciclu elementar:uncicluncarefiecarenodapareosingurdat,cuexcepiaceluifinal,care
coincidecuceliniial
ciclu simplu:uncicluncarefiecarearcapareosingurdat

Observaie: ntr-ungrafneorientatnoiunilededrumilansuntechivalenteideasemeneacelede
circuiticiclu.

Matriceaexisteneidrumurilor

Matriceaexisteneidrumurilor

Fie G=(V,E)ungraf,Amatriceadeadiacen.Ap indicnumruldedrumuridistincte


ntre oricare 2 vrfuri.

Fie operaiilebinaredeadunareinmulire.
Notnd = ( ), = ( ),
C = = ( ),
D = = ( ),
=

max
,

max
,

min

indic existenaunuidrumdelungimep ntre oricare 2 vrfuri.

=
booleana)

M permite verificarea proprietatii de conexitate a grafului.


Toate elementele lui M sunt 1 => Graf conex

- matriceaexisteneidrumurilorngraful G (se fol. algebra

Matriceaexisteneidrumurilor
Exemplu 1
Nr. vf: 4
A = matrice de adiacenta

2
1
3

1 1
A= A =
1

1
0
0
0

1
0
0
1

1
1

0 2 0
, A =

1
1

1
0

0
1
1
1

1
1
1
1

1
1 1 1 1
1 1 1 1

1 3 1 0 1 1
1 1 1 1
, A =
, M =

1
1 1 1 1
1 1 1 1

1
1
1
1
1
1
1
1
1

Matriceaexisteneidrumurilor
Exemplu 2
= =

1
1
1
1
0
0

1
1
1
1
0
0

1
1
1
1
0
0

1
1
1
0
0
0
=

0
0
0
0
0
1

1
1
1
1
0
0

0
0
0
0
1
0

1
1
1
1
0
0

=
1
1
1
1
0
0

1
1
1
1
0
0

0
0
0
0
1
1

0
1
1
0
0
0

1
1
1
1
0
0

0
0
0
0
1
1

1
0
1
0
0
0

1
1
1
1
0
0

1
1
0
1
0
0

1
1
1
1
0
0

0
0
1
0
0
0

1
1
1
1
0
0

0
0
0
0
0
1

0
0
0
0
1
0
=

0
0
0
0
1
0

0
0
0
0
0
1

1
1
1
1
0
0

=
1
1
1
1
0
0

1
1
1
1
0
0

1
1
1
1
0
0

1
1
1
1
0
0
1
1
1
1
0
0

0
0
0
0
1
1

1
1
1
1
0
0
1
1
1
1
0
0

0
0
0
0
1
1

1
1
1
0
0
0
1
1
1
1
0
0

1
1
0
1
0
0
1
1
1
1
0
0

0
0
0
0
1
0
0
0
0
0
0
1

0
0
0
0
0
1
0
0
0
0
1
0

Algoritmul Roy Warshall

(algoritm pentru det. matricei exist. drumurilor)


unsigned char ** Roy_Warshall (unsigned char **a,unsigned n)
{ int i,j,k;
unsigned char **m;
m = new unsigned char*[n];
for(i=0;i<n;i++)
m[i] = new unsigned char[n];
for( i=0; i<n; i++ )
for( j=0; j<n; j++ )
m[i][j] = a[i][j];

for( j=0; j<n; j++ )


for( i=0; i<n; i++ )
if( m[i][j] )
for( k=0; k<n; k++ )
if( m[i][k] < m[k][j] )
m[i][k] = m[k][j];
return m;

Componente conexe
ale unui graf

Componente conexe ale unui graf

Fie G=(V,E) graf netrivial. Vrfurile u,v snt conectate dac


exist un u-v drum n G.

Dac G este un graf, atunci o component conex a lui G


este un subgraf conex al lui G, maximal n raport cu
proprietatea de conexitate.

Un graf este conex dac i numai dac numrul


componentelor sale conexe este 1.

Mulimile de vrfuri corespunztoare oricror dou


componente conexe distincte snt disjuncte.

Componente conexe ale unui graf

Algoritm pentru determinarea unei componente conexe


I: , ,
E: = ( ,

=
Seiniializeazcomponentavid = ,
Seadauglamulimeadevrfurivrfuliniial =
Repet
Parcurgere
Din matricea
Secauttoiveciniinoiaivrfurilordin
iseadauglamulimea
existeneidrumurilor
de vrfuri nadncime/lime
Secauttoatemuchiilenoidintrevrfuriledin iseadaugla
mulimeademuchii
Pncndnusemaigsescvrfurinoi

Sedeterminmulimeavrfurilorconectatecu
Seadaugla toate muchiile dintre vrfurile din

Drumuri de cost minim

Drumuri de cost minim

Fie G=(V,E,w) un graf ponderat. Costul drumului G: u0, u1, ..., un , notat L(G), este definit
prin:

( ,

Pentru orice u iv vrfuri conectate n G, u v, w-distanantreu iv,notatD(u,v),


estedefinitprin
,

unde Duv desemneazmulimeatuturoru-v drumurilor elementare din G.

Drumul pentru care D(u,v)=L(G),senumetedrum de cost minim.

Algoritmi:
Dijkstra (de la un vf dat la restul varfurilor)
Roy-Floyd (de la orice vf la toate celelalte)
Yen (un vf si restul varfurilor)

Algoritmul Dijkstra
Algoritm

fie = , ,
,
etichete pentru fiecare vrf

, graf conex
:(
,
)

=
=
pentru fiecare vrf ,
=
= ,
= , =
pentru <
pentru fiecare vrf
dac
>
+ ( , )

=
+ ( , )

=
determinunvrf a..
esteminim

Algoritmul Dijkstra
Exemplu
Fie graful ponderat
1
5

3
16

2
5
4

Implementare
vezi suport de curs

Algoritmul Dijkstra implementare (1)

#include <stdio.h>
#include <malloc.h>
typedef struct{ float l;
int vf;
}eticheta;

//subprogram
//preia datele unui graf in forma tabelara din fisierul nume si obtine
//matricea ponderilor, unde MAX este valoarea cu semnificatie de infinit
//ultima linie a fisierului contine virful initial din algoritmul Dijkstra

//subprogram
//functia pentru implementarea algoritmului Dijkstra - returneaza
//vectorul de etichete
//(de exemplu: 5,1 pentru varful 2,
//unde 5 costul minim pentru a ajunge din 1 in 2)

//subprogram
//functia principala

Algoritmul Dijkstra implementare (2)


void preia_graf(char *nume, float ***w, int *n, int *v0, float MAX)
{ int i,j,m,u,v; float p;
FILE *f=fopen(nume,"rt");
fscanf(f,"%i",n);
float **mw=(float **)malloc(*n*sizeof(float*));
for(i=0;i<*n;i++)
mw[i]=(float *)malloc(*n*sizeof(float));
fscanf(f,"%i",&m);
for(i=0;i<*n;i++)
for(j=0;j<*n;j++)
mw[i][j]=MAX;
for(i=0;i<m;i++)
{ fscanf(f,"%i",&u);
fscanf(f,"%i",&v);
fscanf(f,"%f",&p);
mw[u-1][v-1]=mw[v-1][u-1]=p; }
fscanf(f,"%i",v0);
fclose(f);
*w=mw;}

Algoritmul Dijkstra implementare


(3a)

eticheta * Dijkstra (float **w, int n, int v0, float MAX)


{ int i,*prel,nrit,ui,v,vmin;
float lmin;
eticheta *v_et=(eticheta *)malloc(n*sizeof(eticheta));
for(i=0;i<n;i++)
v_et[i].l=MAX;
v_et[v0-1].l=0;
*prel=(int*)malloc(n*sizeof(int));
//vector cu proprietatea prel[i]=1 daca pentru virful i+1 a
//fost deja determinat un drum de cost minim
//prel[i]=0 in caz contrar
for(i=0;i<n;i++)
prel[i]=0;
prel[v0-1]=1;

Algoritmul Dijkstra implementare (3b)

ui=v0;
for(nrit=0;nrit<n-1;nrit++)
{ lmin=MAX;
//sunt recalculate w-distantele de la virfurile v cu prel[v-1]=0 si este determinat vmin, //urmatorul
virf cu proprietatea ca pentru acesta a fost determinat un drum de cost minim,
// lmin
for(v=1;v<=n;v++)
{ if((prel[v-1]==0)&&(v_et[v-1].l>v_et[ui-1].l+w[v-1][ui-1]))
{ v_et[v-1].l=v_et[ui-1].l+w[v-1][ui-1];
v_et[v-1].vf=ui;
}
if((prel[v-1]==0)&&v_et[v-1].l<lmin)
{ lmin=v_et[v-1].l; vmin=v;
}
}
ui=vmin; prel[ui-1]=1;
}
free(prel); return v_et;
}

Algoritmul Dijkstra implementare (4)

void main()
{ float **w,MAX=1000000; int n,v0,v,u,i;
preia_graf("graf.txt",&w, &n, &v0, MAX);
eticheta *rez=Dijkstra(w,n,v0,MAX);
for(v=1;v<=n;v++)
if(v!=v0)
{ printf("Costul unui cel mai ieftin drum de la %i la %i este %8.3f",v,v0,rez[v-1].l);
printf("\n Un drum de cost minim: %i ",v);
u=v;
while(rez[u-1].vf!=v0)
{ printf("%i ",rez[u-1].vf);
u=rez[u-1].vf;
}
printf("%i \n\n",v0);
}
free(rez);
for(i=0;i<n;i++) free(w[i]);
free(w);
}

Algoritmul Roy - Floyd


Istoric
publicat sub forma cunoscutnprezentdectre
Robert Floyd n 1962.
asemntoralgoritmuluipublicatdectre
Bernard Roy n 1959.

Aplicabilitate

folosit n domenii diverse


ex:

stabilirea traseelor feroviare sau aeriene


jocuri informatice

Algoritmul Roy - Floyd

n unele aplicaii este necesar exclusiv determinarea w - distanelor D(v0,v),


pentru toi v din multimea V.
n acest caz algoritmul Roy-Floyd permite o rezolvare a acestei probleme mai
simplu de implementat dect algoritmul Dijkstra.

Determincostulminimaldrumuluidintreoricaredouvrfurix,y,precumiun
astfel de drum.
IniialsepornetedelamatriceacosturilorC(distantelor) carevafitransformatn
matricea drumurilor de cost minim astfel:
se considerunvrfk(k=1,n)ipentrufiecarek secomparcostuldrumului,dinacelmoment,
dintreiij(i,j=1,n), cusumacosturilordintredrumul(i,k)idrumul(k,j),;
n cazul n care costul drumului (i,j) ce trece prin k este mai mic dect drumul existent deja
nseamncamgsitunnoudrumdecostmaimicntrevrfurileiij,trecndprink.
n cazul acesta costul drumului de la i la j va fi suma costurilor drumului de la i la k cu drumul
de la k la j, iar tata[i][j] va fi tata[k][j] (se vareactualizaivectorultatapentruaputea
reconstitui drumul minim).

Algoritmul Roy - Floyd

Exemplu
Fie G=(V, E) un graf neorientat (n noduri si m muchii) memorat prin
matricea ponderilor. Se cere ca pentru doua noduri x,y citite sa se
determine lungimea minima a lantului de la x la y.
Matricea costurilor

0 210
2 03
3018
1010
80
-Se incearca pentru oricare pereche de noduri i,j sa se obtina drumuri mai scurte prin
noduri intermediare k (k1...n).
- Acest lucru se determina comparand lungimea lantului a[i,j] cu lungimea lantului care
trece prin k si daca: a[i,j] > a[i,k]+a[k,j] atunci se atribuie:
a[i,j] a[i,k]+a[k,j] costuri vor fi modificate sunt urmatoareale intrucat intre
ele exista costuri mai mici.

Algoritmul Roy - Floyd

Pe baza matricii obtinute se extrag rutele pentru varfurile date.


Rezultat: pentru un drum de la 1 la 4:
- cost minim: 6
- traseul: 1-2-3-4

Algoritmul Roy - Floyd


void Roy_Floyd (float w[10][10], unsigned n,
float d[10][10], float MAX)
{ int i,j,k;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
d[i][j] = w[i][j];
for (j=0;j<n;j++)
for (i=0;i<n;i++)
if(d[i][j]<MAX)
for (k=0;k<n;k++)
if (d[i][k] > d[i][j] + d[j][k])
d[i][k] = d[i][j] + d[j][k];
}

- Graf ponderat conex


- Calcul dinamic al distantei intre
oricare doua varfuri i si k
- Daca exista un i-k drum care trece
prin j (1<=j<=n), cu costul
<dij+dik)<djk :
=>noul drum de la i la k are
costul mai mic decat vechiul drum
=> distanta i-k trebuie
actualizata la dij+djk

Scop:
algoritm utilizat:

Algoritmul Yen

pentru determinarea tuturor w-distantelor intr-un graf ponderat;


pentru identificarea distantelor minime de la varful x1 la varfurile x2,xj,...,xn
pentru un graf

mai eficient decat Roy-Floyd dpdv al volumului de operatii.


Algoritm:
Pas1: D=W
Pas2: i=1, (k)=0, b(k)=0, (j)=1,pentruto 1<=j<=n,jk
Pas3: Calculeaza min{dkj, 1<=j<=n, (j)=1}
Determina j0 cu (j0)=1 si dkj = min {dkj, 1<=j<=n, (j)=1}
B(j0) = dkj , (j0)=0
d[k,j]=min{d[k,j],d[k,j0]+d[j0,j]}, pentru toti 1<=j<=n
i=i+1
0

Pas4: Daca i<n, reia Pas 3, altfel STOP.

Algoritmul Yen
Exemplu

Vf initial = 1 (vf1)

Algoritmul Yen
1
4
5

3
7

2
1
4

Vk=1

2
5
3

Algoritmul Yen
Pas 3: j0=2, B(2)=3, = (0,0,0,1,1);
nicio modificare in matricea D; i=3
Pas 4: i<5, reia Pas 3

1
4
5

3
7

2
1
4

2
5
3

Vk=1

Algoritmul Yen
Rezultat:

=(

Vf initial = 1 (vf1)
Drum vf1->vf2 => cost1 = 3
cost2 = 2+5 = 7
cost3 = 7+4+5 = 16
cost4 = 4+1+5 = 10
=> se alege costul cel mai mic (3)

Spor la invatat !

Referinte bibliografice

ATP suport de curs si seminar


http://campion.edu.ro/arhiva/www/arhiva_2009/seds/17/index.htm
http://software.ucv.ro/~cmihaescu/ro/teaching/ACA/docs/Roy-Floyd.pdf

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