Documente Academic
Documente Profesional
Documente Cultură
Algoritmi și tehnici de
programare
Cursul 10
+
Grafuri
◼ Drumuri în grafuri
◼ Matricea existenţei drumurilor
◼ Algoritmul Roy-Warshall
◼ Componente conexe ale unui graf
◼ Algoritmul Roy-Floyd
◼ Algoritmul lui Dijkstra
+
Grafuri
◼ FieG=(V, E) un graf orientat. Graful G se numeşte
graf antisimetric dacă pentru oricare două
vârfuri din graf x şi y dacă există arcul (x,y), atunci
nu există arcul (y,x).
+
Grafuri
◼ Fie G=(V, E) un graf. Graful G se numeşte graf complet
dacă oricare două vârfuri distincte ale sale sunt adiacente.
◼ Primul
nod și ultimul nod dintr-un lanț formează
extremitățile lanțului.
+
Grafuri
◼ Unlanţ este elementar dacă el nu conţine de mai
multe ori acelaşi vârf.
◼ Circuitul
se numeşte elementar dacă nu conţine
de mai multe ori acelaşi vârf (exceptând
extremităţile sale).
Lanț hamiltonian:1,2,3,5,4
Ciclu hamiltonian:1,2,3,5,4,1
1 2
cij=max{aij, bij}
0 1 1 0 1 0
1 0 1 1 0 0
dij=max{min{aik, bkj}, 0 ≤ k ≤ n}
1 1 1 1 1 1
0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
1 1 0 0 0 2 1 1 1 1 3 1 1 1 1 1 1 1 1
A= A = , A = , A = , M =
1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1
m = (int**) malloc(n*sizeof(int*));
for(i=0;i<n;i++)
*(m+i)= (int*) malloc(n*sizeof(int));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
m[i][j]=a[i][j];
for (k=0;k<n;k++)
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if(m[i][j]==0) m[i][j]=m[i][k]*m[k][j];
return m;
}
+
Componente conexe ale unui graf
◼ I: 𝑢0 , 𝐺, 𝑛
◼ E: 𝐶 = (𝑉𝑐 , 𝐸𝑐 )
for (k=0;k<n;k++)
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if(d[i][j]>d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j];
return d;
}
+
Algoritmul Dijkstra
◼ S={𝒙𝟎 }
◼ S =𝑽−S
◼ pentru fiecare vârf 𝒗∈𝑽, 𝑳(𝒗)=∞//sau costul initial
◼ 𝑳(𝒙𝟎 )=𝟎, ped(𝒙𝟎 )=−𝟏
◼ pentru 𝟏≤𝒊<𝒏
◼ pentru fiecare vârf 𝒗∈
S
◼ dacă 𝑳(𝒗) > 𝑳(𝒗𝒌 )+𝐰(𝒗𝒌 ,𝒗)
◼ 𝑳(𝒗)= 𝑳(𝒗𝒌 )+𝐰(𝒗𝒌 ,𝒗)
◼ pred(𝒗)=𝒗𝒌
◼ S=S∪{𝒗𝒌 }
◼ S = S−{𝒗𝒌 }
+
Algoritmul Dijkstra
+
Algoritmul Dijkstra
◼ Ne propunem sa determinam costul minim de la un vârf la toate celelalte vârfuri. Fie
acesta vârful x=1 (xo=x-1=0).
◼ Vectorul pred , vector de tip tata/părinte care va indica drumurile găsite intre vârful 1 si
celelalte vârfuri astfel încât pentru fiecare vârf se va retine precedentul (tatăl/părintele).
Pentru vârful de pornire, 1 in cazul nostru, se retine -1. Inițial pred va retine :
-1 0 -1 0 -1
+
Algoritmul Dijkstra