atp - curs 9-10_complet
TRANSCRIPT
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 1/41
Drumuri in grafuri
ConexitateDrumuri de cost minim
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 2/41
Drumuri in graf
• drum (sau lant pentru graf neorientat)
• drum trivial
• drum deschis• drum inchis
• drum elementar
• subdrum
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 3/41
Drumuri in graf
• Fie G=(V ,E ) un graf, u,v ÎV .• Secvenţa de vîrfuri G : u0, u1, ..., un este un u-v drum dacă u0=u, un=v,
uiui+1ÎE , 0 ≤ i ≤ n.
Drum simplu – fiecare muchie apare o singura data
Lungimea drumului, notată l (G ) este egală cu n.
Convenţional se numeşte drum trivial un drum G cu l (G )=0.
Pentru drumul din figura, l (G ) = ?
1
v2
v3
v4 v5
v6 v7
v8
v9
v10
Fig.1 V1-V10 drum
l (G ) = 8
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 4/41
Drumuri in graf
• Fie G : u0, u1, ..., un un drum în graful G=(V ,E ). G este un
drum închis dacă u0=un; în caz contrar G se numeşte
drum deschis.
v1
v2
v3
v4 v5
v6 v7
v8
v9
v10
Fig.2 Drum inchis
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 5/41
Drumuri in graf
• Drumul G este elementar dacă oricare două vîrfuri din G sînt distincte, cu excepţia, eventual, a extremităţilor.
v1
v2
v3
v4 v5
v6 v7
v8
v9
v10
Fig.3 Exemplu de drum elementar(contine doar varfuri distincte)
Drumul G este proces dacă pentru orice 0 ≤ i ≠ j ≤ n-1 ui ui+1 ≠ u j u j+1.
Orice drum elementar este un proces.
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 6/41
Drumuri in graf
• Fie G : u0, u1, ..., un un drum în graful G=(V ,E ). G ’ : v 0, v 1,..,v m este un subdrumal lui G dacă G ’ este un drum şi pentru orice j , 0 ≤ j ≤ m , există i , astfel încît
ui = v j . Orice drum cu lungime cel puţin 1 conţine cel puţin un drum
elementar cu aceleaşi extremităţi.
v1
v2
v3
v4 v5
v6 v7
v8
v9
v10
Fie drumul G : v 1, v 2, v 4, v 5, v 3, v 1, v 2, v 5, v 6, v 7 , v 8, v 9, v 5, v 9, v 8, v 10
Atunci G 1: v 1, v 2, v 5, v 9, v 8, v 10
G 2: v 1, v 2, v 4, v 5, v 9, v 8, v 10
sînt v 1-v 10 subdrumuri elementare.
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 7/41
Drumuri in graf
• Exercitiu 1a: fie graful neorientatCare 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
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 8/41
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
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 9/41
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 douamai putin primul si ultimul. In caz contrar, el este neelementar.
• Observaţie: Într-un graf neorientat noţiunile de circuit şi ciclu
sunt echivalente.
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
Exemplu
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 10/41
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
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 11/41
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
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 12/41
Drumuri in graf
Rezumat:• drum într-un graf: o mulţime ordonată de noduri ale grafului: (x1, x2, ..., xk), cu proprietatea că
există în graf toate arcele de forma (xi,xi+1) i = 1,...,k-1;• lungimea unui drum: este numărul arcelor care îl formează;• drum elementar : un drum în care fiecare nod apare o singură dată;• drum simplu: un drum în care fiecare arc apare o singură dată;• drum hamiltonian: un drum elementar care trece prin toate nodurile grafului;• drum eulerian: un drum simplu care conţine toate arcele grafului;
• lanţ: un drum în care arcele nu au neapărat acelaşi sens de parcurgere;
• circuit: un drum în care nodul iniţial coincide cu cel final;• circuit elementar : un drum în care fiecare nod apare o singură dată, cu excepţia celui final, care
coincide cu cel iniţial;• circuit simplu: un drum în care fiecare arc apare o singură dată;• circuit hamiltonian: un circuit care trece prin toate nodurile grafului;• ciclu: este un circuit în care arcele nu au neapărat acelaşi sens de parcurgere;• ciclu elementar : un ciclu în care fiecare nod apare o singură dată, cu excepţia celui final, care
coincide cu cel iniţial;• ciclu simplu: un ciclu în care fiecare arc apare o singură dată;
Observaţie: Într-un graf neorientat noţiunile de drum şi lanţ sunt echivalente şi de asemenea cele decircuit şi ciclu.
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 13/41
Matricea existenței drumurilor
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 14/41
Matricea existenței drumurilor
• Fie G=(V ,E ) un graf, A matricea de adiacenţă. Ap indică numărul de drumuri distincte între oricare 2 vîrfuri.
• Fie operaţiile binare de adunare şi înmulţire.Notînd = (), = (),
C = ⨁ = (),D = ⨂ = (),
= max , , = max , min ,
indică existența unui drum de lungime p între oricare 2 vîrfuri.
• = ⨁ ⨁…⨁ - matricea existenței drumurilor în graful G (se fol. algebrabooleana)
• M permite verificarea proprietatii de conexitate a grafului.Toate elementele lui M sunt 1 => Graf conex
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 15/41
Matricea existenței drumurilor
• Exemplu 1
1
2
3
4
÷÷÷÷÷
ø
ö
ççççç
è
æ
=
÷÷÷÷÷
ø
ö
ççççç
è
æ
=
÷÷÷÷÷
ø
ö
ççççç
è
æ
=
÷÷÷÷÷
ø
ö
ççççç
è
æ
==
1111
1111
11111111
,
1111
1111
11011111
,
1111
1111
11101101
,
0101
1001
00011110
321 M A A A A
Nr. vf: 4
A = matrice de adiacenta
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 16/41
Matricea existenței drumurilor
• Exemplu 2
= =
0 1 1 0 0 0
1 0 1 0 0 0
1 1 0 1 0 0
0 0 1 0 0 0
0 0 0 0 0 1
0 0 0 0 1 0
=
1 1 1 1 0 0
1 1 1 1 0 0
1 1 1 0 0 0
1 1 0 1 0 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 0 0 0
0 0 0 0 0 1
0 0 0 0 1 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 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
0 0 0 0 0 1
0 0 0 0 1 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
0 0 0 0 1 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
0 0 0 0 1 1
0 0 0 0 1 1
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 17/41
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;
0
1
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 18/41
Componente conexe
ale unui graf
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 20/41
Componente conexe ale unui graf • Algoritm pentru determinarea unei componente conexe
– I: , , – E: = ( ,)
– Se iniţializează componenta vidă = ∅, = ∅ – Se adaugă la mulţimea de vîrfuri vîrful iniţial
=
∪ – Repetă
• Se caută toţi vecinii noi ai vîrfurilor din şi se adaugă la mulţimeade vîrfuri
• Se caută toate muchiile noi dintre vîrfurile din şi se adaugă lamulţimea de muchii
– Pînă cînd nu se mai găsesc vîrfuri noi
• Se determină mulțimea vîrfurilor conectate cu → • Se adaugă la toate muchiile dintre vîrfurile din →
Parcurgere în adîncime / lățime
Din matriceaexistenței drumurilor
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 21/41
Drumuri de cost minim
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 22/41
Drumuri de cost minim
• Fie G=(V ,E ,w ) un graf ponderat. Costul drumului G : u0, u1, ..., un , notat L(G ), este definitprin:
Γ = (,)
• Pentru orice u şi v vîrfuri conectate în G, u ≠ v , w-distanţa între u şi v , notată D(u,v ),este definită prin
, = Γ , Γ ∈
unde Duv desemnează mulţimea tuturor u-v drumurilor elementare din G.
• Drumul pentru care D(u,v )=L(G ), se numeşte drum 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)
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 23/41
Algoritmul Dijkstra
Algoritm
• fie = ,, , ∈ , graf conex• etichete pentru fiecare vîrf ∈ : ( , )
• = • = − • pentru fiecare vîrf ∈ , = ∞• = , = −, • pentru ≤ <
– pentru fiecare vîrf ∈ • dacă > +( ,)
– = +( ,) – = – determină un vîrf ∈ a.î. este minimă
– = – = ∪ – = −
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 24/41
Algoritmul DijkstraExemplu
1
23
45
15
9
25
16
Fie graful ponderat
• Implementare
• vezi suport de curs
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 25/41
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
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 26/41
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;
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 27/41
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;
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 28/41
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;•
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 29/41
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);•
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 30/41
Algoritmul Roy - Floyd
• Istoric – publicat sub forma cunoscută în prezent de către
Robert Floyd în 1962. – asemănător algoritmului publicat de către
Bernard Roy în 1959.
• Aplicabilitate – folosit în domenii diverse
– ex:• stabilirea traseelor feroviare sau aeriene
• jocuri informatice
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 31/41
Algoritmul Roy - Floyd
• În unele aplicaţii este necesară exclusiv determinarea w - distanţelor D(v0,v), pentru toţi v din multimea V.
• În acest caz algoritmul Roy-Floyd permite o rezolvare a acestei probleme maisimplu de implementat decît algoritmul Dijkstra.
• Determină costul minim al drumului dintre oricare două vârfuri x, y, precum şi unastfel de drum.
• Iniţial se porneşte de la matricea costurilor C(distantelor) care va fi transformată înmatricea drumurilor de cost minim astfel: – se consideră un vârf k (k=1,n) şi pentru fiecare k se compară costul drumului, din acel moment,
dintre i şi j (i,j=1,n), cu suma costurilor dintre drumul (i,k)şi drumul (k,j),; – în cazul în care costul drumului (i,j) ce trece prin k este mai mic decât drumul existent deja
înseamnă că am găsit un nou drum de cost mai mic între vârfurile i şi j, trecând prin k.
– În cazul acesta costul drumului de la i la j va fi suma costurilor drumului de la i la k cu drumulde la k la j, iar tata[i][j] va fi tata[k][j] (se va reactualiza şi vectorul tata pentru a puteareconstitui drumul minim).
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 32/41
Algoritmul Roy - FloydExemplu
• Fie G=(V, E) un graf neorientat (n noduri si m muchii) memorat prinmatricea ponderilor. Se cere ca pentru doua noduri x,y citite sa sedetermine lungimea minima a lantului de la x la y.
0 2 ∞ 10 ∞
2 0 3 ∞ ∞∞ 3 0 1 8
10 ∞ 1 0 ∞
∞ ∞ 8 ∞ 0
Matricea costurilor
-Se incearca pentru oricare pereche de noduri i,j sa se obtina “drumuri” mai scurte prin
noduri intermediare k (k∈1...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.
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 33/41
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
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 34/41
Algoritmul Roy - Floydvoid 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 arecostul mai mic decat vechiul drum
=> distanta i-k trebuie
actualizata la dij+djk
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 35/41
Algoritmul YenScop:
• algoritm utilizat:
– 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, pentru to 1<=j<=n, j≠k
• Pas3: Calculeaza mind kj , 1<=j<=n, λ(j)=1
Determina j 0 cu λ(j 0 )=1 si d kj 0 = min d kj , 1<=j<=n, λ(j)=1
B(j 0 ) = d kj 0 , λ(j 0 )=0d[k,j]=mind[k,j],d[k,j 0 ]+d[j 0 ,j], pentru toti 1<=j<=n
i=i+1
• Pas4: Daca i<n, reia Pas 3, altfel STOP.
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 36/41
Algoritmul Yen
• Exemplu – Vf initial = 1 (vf1)
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 37/41
Algoritmul Yen1
2
3
4
5
4
4
5
2
3
7
1
Vk=1
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 38/41
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
2
34
5
4
4
5
2
3
7
1
Vk=1
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 39/41
Algoritmul Yen
Vf initial = 1 (vf1)
Drum vf1->vf2 => cost1 = 3cost2 = 2+5 = 7
cost3 = 7+4+5 = 16
cost4 = 4+1+5 = 10
=> se alege costul cel mai mic (3)
= ( )Rezultat:
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 40/41
Spor la invatat !
8/15/2019 ATP - Curs 9-10_complet
http://slidepdf.com/reader/full/atp-curs-9-10complet 41/41
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