Documente Academic
Documente Profesional
Documente Cultură
Conexitate
Drumuri de cost minim
Drumuri in graf
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
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
v10
Drumuri in graf
Drumul G este elementar dacoricaredouvrfuridinG
sntdistincte,cuexcepia,eventual,aextremitilor.
v2
v6
v1
v4
v3
v7
v5
v8
v9
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
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
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:
Observaie: ntr-ungrafneorientatnoiunilededrumilansuntechivalenteideasemeneacelede
circuiticiclu.
Matriceaexisteneidrumurilor
Matriceaexisteneidrumurilor
Fie operaiilebinaredeadunareinmulire.
Notnd = ( ), = ( ),
C = = ( ),
D = = ( ),
=
max
,
max
,
min
=
booleana)
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
Componente conexe
ale unui graf
=
Seiniializeazcomponentavid = ,
Seadauglamulimeadevrfurivrfuliniial =
Repet
Parcurgere
Din matricea
Secauttoiveciniinoiaivrfurilordin
iseadauglamulimea
existeneidrumurilor
de vrfuri nadncime/lime
Secauttoatemuchiilenoidintrevrfuriledin iseadaugla
mulimeademuchii
Pncndnusemaigsescvrfurinoi
Sedeterminmulimeavrfurilorconectatecu
Seadaugla toate muchiile dintre vrfurile din
Fie G=(V,E,w) un graf ponderat. Costul drumului G: u0, u1, ..., un , notat L(G), este definit
prin:
( ,
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
#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
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;
}
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);
}
Aplicabilitate
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).
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.
Scop:
algoritm utilizat:
Algoritmul Yen
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