Documente Academic
Documente Profesional
Documente Cultură
Gr.213
Laborator 2
Algoritmul lui Floyd Warshall Hu
1.Formulare enun
S se determine un drum de valoare minim de la un vrf p la un vrf q cu
ajutorul algoritmului matricial Floyd Warshall Hu
3.Descrierea algoritmului
for i := 0 to n-1 do
for j := 0 to n-1 do
if i == j then
D[i,j]
else
if (i,j) is in E
D[i,j]
else
D[i,j]
end if
end if
end for
end for
:= 0;
then
:= w(i,j);
:= oo;
for k := 0 to n-1 do
for i := 0 to n-1 do
for j := 0 to n-1 do
if D[i,k] + D[k,j] < D[i,j] then
D[i,j] = D[i,k] + D[k,j];
end if
end for
end for
end for
END
Hanusz Mnika
Gr.213
Pornind cu valori ale lui k de la 1 la |V|, ne intereseaz s gsim cea mai scurt
cale de la fiecare p la fiecare q folosind doar noduri intermedire din mulimea {1,
, k}. De fiecare dat, comparm valoarea deja estimat al drumului de la p la q,
deci d[p, q, k-1] obinut la pasul anterior, cu valoarea drumurilor de la p la k si de
la k la q, adic d[p, k, k-1] + d[k, q, k-1], obinut la pasul anterior. Atunci, d[p, q, |
V|] va conine valoarea drumului minim de la p la q .
Pentru a determina drumul efectiv, nu doar valoarea acestuia, avem dou
variante:
Se folosete divide et impera astfel:
-
5.Cod surs
#include <iostream>
using namespace std;
int main(){
// Initializare
int vertices = 5;
vector > a(vertices, vector(vertices,999999999));
// initializare diagonala
for(int i=0; i < vertices; i++)
a[i][i]=0
// initialize distanta
a[0][1]=20;
a[0][2]=10;
a[0][4]=5;
a[2][3]=10;
a[3][1]=3;
a[4][2]=2;
a[4][3]=4;
Hanusz Mnika
Gr.213
// Floyd-Warshall
// Add nodes between (first 1 then 2, 3 till n) and look if
// distance is shorter
for(int k = 0; k < vertices; k++)
for(int i = 0; i < vertices; i++)
for(int j = 0; j < vertices; j++)
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
// Print out final distance matrix
for(int i = 0; i < vertices; i++){
for(int j = 0; j < vertices; j++)
cout << a[i][j] << " ";
cout << endl;
}
}
return 0;
6.Date de test