Floyd-Warshall-algoritmus

Üdvözlöm, Ön a Floyd-Warshall-algoritmus szó jelentését keresi. A DICTIOUS-ban nem csak a Floyd-Warshall-algoritmus szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a Floyd-Warshall-algoritmus szót egyes és többes számban mondani. Minden, amit a Floyd-Warshall-algoritmus szóról tudni kell, itt található. A Floyd-Warshall-algoritmus szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. AFloyd-Warshall-algoritmus és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Kiejtés

  • IPA:

Főnév

Floyd-Warshall-algoritmus

  1. (matematika, algoritmusok, gráfelmélet) A Floyd-Warshall-algoritmus egy dinamikus programozási technikán alapuló algoritmus, amely egy súlyozott gráf összes csúcspárja közötti legrövidebb útvonalat határozza meg. Az algoritmus irányított és irányítatlan gráfokon egyaránt működik, és negatív élű gráfokat is kezel, feltéve, hogy nincsenek negatív súlyú körök.



Elmélet

Algoritmus alapelve

Az algoritmus iteratívan javítja a legrövidebb utak hosszát. Kezdetben a közvetlen élek súlyát vesszük figyelembe, majd minden iterációban megvizsgáljuk, hogy egy köztes csúcs (k)-n keresztül rövidebb út található-e.

  • D(i, j): Az (i)-ből (j)-be vezető legrövidebb út hossza.
  • Alaphelyzet: [ D(i, j) = ]
  • Rekurzív formula: ahol (k) az aktuálisan vizsgált köztes csúcs.

Fontos tulajdonságok

  • Időkomplexitás: (O(V^3)), ahol (V) a csúcsok száma.
  • Térkomplexitás: (O(V^2)), mivel egy távolságmátrixot használunk.
  • Negatív körök kezelése: Ha a főátló mentén egy érték negatívvá válik ((D(i, i) < 0)), akkor negatív súlyú kör van a gráfban.



Pszeudokód

FloydWarshall(G):
    n = G.csúcsok_száma
    D = mátrix(n x n)  // Kezdeti távolságmátrix
    inicializáld D-t G élsúlyaival

    ciklus k = 1-től n-ig:
        ciklus i = 1-től n-ig:
            ciklus j = 1-től n-ig:
                D = min(D, D + D)

    visszatér D

Python implementáció

def floyd_warshall(graph):
    # Csúcsok száma
    n = len(graph)
    # Távolságmátrix inicializálása
    dist =  * n for _ in range(n)]

    for i in range(n):
        for j in range(n):
            if i == j:
                dist = 0  # Saját csúcsba való távolság 0
            elif graph != 0:
                dist = graph  # Élek súlya

    # Floyd-Warshall algoritmus
    for k in range(n):
        for i in range(n):
            for j in range(n):
                dist = min(dist, dist + dist)

    return dist

# Példa gráf
graph = [
    ,
    ,
    ,
    
]

distances = floyd_warshall(graph)
for row in distances:
    print(row)

Példa bemenet:

0   3   ∞   5
2   0   ∞   4
∞   1   0   ∞
∞   ∞   2   0

Példa kimenet:

0   3   7   5
2   0   6   4
3   1   0   5
5   3   2   0

C++ implementáció

#include <iostream>
#include <vector>
#include <limits>

using namespace std;

const int INF = numeric_limits<int>::max();

void floydWarshall(vector<vector<int>>& graph) {
    int n = graph.size();
    vector<vector<int>> dist = graph;

    for (int k = 0; k < n; ++k) {
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (dist != INF && dist != INF && dist + dist < dist) {
                    dist = dist + dist;
                }
            }
        }
    }

    // Távolságok kiíratása
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (dist == INF) {
                cout << "INF ";
            } else {
                cout << dist << " ";
            }
        }
        cout << endl;
    }
}

int main() {
    vector<vector<int>> graph = {
        {0, 3, INF, 5},
        {2, 0, INF, 4},
        {INF, 1, 0, INF},
        {INF, INF, 2, 0}
    };

    floydWarshall(graph);

    return 0;
}

Kimenet:

0   3   7   5
2   0   6   4
3   1   0   5
5   3   2   0

Összegzés

A Floyd-Warshall-algoritmus egy robusztus, egyszerű algoritmus az összes csúcspár közötti legrövidebb utak megtalálására. Bár időkomplexitása (O(V^3)), ami nagy gráfok esetén nem ideális, kis és közepes méretű gráfokon hatékony és könnyen implementálható. Az algoritmus emellett képes kezelni negatív súlyú éleket, de negatív súlyú körök esetén a probléma felismerésére is alkalmas.


Fordítások