Informatika gyűjtemény

Egy szinttel feljebb 8. óra - Floyd-Warshall algoritmus

2004050607080910

NézetNyomtat

8. óra

Nekilátunk a gráfalgoritmusok átnézésének. Először távolságokat számolgatunk gráfokban.

Floyd-Warshall algoritmus

A probléma

Adott egy (esetleg élsúlyozott, irányított) gráf. Határozzuk meg az összes pontpárra a gráfban számított távolságokat. Két pont (i és j) távolsága a legrövidebb i-ből j-be vezető út hossza. Az út hossza pedig a benne szereplő (irányított) élek összsúlya. Ha a gráf súlyozatlan, akkor az út hossza a benne szereplő élek száma, tehát úgy számolhatunk, mintha minden súly egységnyi lenne.

A megoldási ötlet

Az i-ből j-be vezető út hosszát több lépésben számoljuk ki. Bevezetjük a $d_k(i,j)$ függvényt, ami az i-ből j-be vezető olyan utak közül a legrövidebb hossza, amelyek i-től és j-től eltekintve csak az 1,2,...,k csúcsokon haladnak át. (Nem feltétlenül mindegyiken.)
Ekkor $d_0(i,j)$ az (i,j) él hossza, ha i és j különbözik és van köztük él, végtelen, ha nincs köztük él, és $d_0(i,i)=0$.
Feladatunk $d_n(i,j)$ kiszámítása, ezt n lépésben tesszük meg, k=1,2,...,n-re meghatározzuk $d_k(i,j)$-t.
A számítása alapja a következő rekurzió:
$d_k(i,j)=\min(d_{k-1}(i,j), d_{k-1}(i,k)+d_{k-1}(k,j))$

Az algoritmus

kezdetben minden i,j-re legyen d[i,j] az (i,j) él hossza, d[i,i] pedig 0
amennyiben nincs (i,j) él, olyankor d[i,j]=végtelen

Ciklus k := 1-től n-ig 
    Ciklus i := 1-től n-ig 
        Ciklus j := 1-től n-ig 
                    d[i,j] = min(d[i,j], d[i,k] + d[k,j])
        Ciklus vége
    Ciklus vége
Ciklus vége
Az algoritmusban nem használtuk a $k$ indexet. Gondoljuk végig, hogy ez nem befolyásolja az algoritmus helyességét.

Feladat