Dinitův algoritmus

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 24. května 2021; kontroly vyžadují 3 úpravy .

Dinitzův algoritmus je polynomiální algoritmus pro nalezení maximálního toku v dopravní síti , navržený v roce 1970 sovětským (později izraelským) matematikem Efimem Dinitzem . Časová složitost algoritmu je . Takový odhad lze získat zavedením pojmů pomocná síť a blokující (pseudomaximální) tok . V sítích s jednotkovou šířkou pásma existuje silnější odhad časové složitosti: .

Popis

Dovolit být  dopravní síť , ve které a  jsou, v tomto pořadí, propustnost a tok přes okraj .

Zbytková šířka pásma  je mapování definované jako:
  1. pokud , V jiných zdrojích
  2. v opačném případě.
Zbytková síť  - graf , kde . Doplňková cesta  je cesta v grafu reziduí . Nechť  je délka nejkratší cesty z do v grafu . Pak pomocnou sítí grafu  je graf , kde . Blokující tok  je takový tok , že graf c neobsahuje cestu.

Algoritmus

Dinitův algoritmus

Vstup : Síť . Výstup : maximální průtok .
  1. Nainstalujte pro každý .
  2. Vytvořit z grafu . Pokud , zastavte a vystupte .
  3. Najděte blokující vlákno v .
  4. Rozšiřte tok o tok a přejděte ke kroku 2.

Analýza

Je možné ukázat, že pokaždé, když se počet hran na nejkratší cestě od zdroje k jímce zvýší alespoň o jednu, takže v algoritmu již nejsou žádné blokující toky, kde  je počet vrcholů v síti. Pomocná síť může být vybudována procházením v čase do šířky a blokovací tok na každé úrovni grafu lze nalézt v čase . Proto je doba běhu algoritmu Dinits .

Pomocí datových struktur nazývaných dynamické stromy je možné najít blokující tok v každé fázi v čase , poté lze dobu běhu Dinitzova algoritmu zlepšit na .

Příklad

Níže je simulace Dinitzova algoritmu. V pomocné síti jsou vrcholy s červenými štítky hodnotami . Blokovací závit je označen modře.

jeden.

Blokující vlákno se skládá z cest:

  1. se 4 průtokovými jednotkami,
  2. se 6 průtokovými jednotkami a
  3. se 4 průtokovými jednotkami.

Blokující tok tedy obsahuje 14 jednotek a hodnota toku je 14. Všimněte si, že doplňková cesta má 3 hrany.

2.

Blokující vlákno se skládá z cest:

  1. s 5 průtokovými jednotkami.

Blokující tok tedy obsahuje 5 jednotek a hodnota toku je 14 + 5 = 19. Všimněte si, že komplementární cesta má 4 hrany.

3.

Akcie nejsou dostupné v síti . Proto se algoritmus zastaví a vrátí maximální tok o velikosti 19. Všimněte si, že v každém blokovacím toku se počet hran v komplementární cestě zvýší alespoň o jednu.

Historie

Dinitzův algoritmus byl publikován v roce 1970 bývalým sovětským vědcem Efimem Dinitzem, který je nyní členem Fakulty počítačového inženýrství na Ben-Gurionově univerzitě (Izrael), dříve než algoritmus Edmonds-Karp , který byl publikován v roce 1972, ale vytvořené dříve. Nezávisle na sobě ukázali, že v případě Ford-Fulkersonova algoritmu , pokud je komplementární cesta nejkratší, délka komplementární cesty se nezmenšuje.

Dinitzův algoritmus s propagací

Časovou složitost algoritmu lze snížit optimalizací procesu hledání blokujícího vlákna. K tomu je nutné zavést pojem potenciál . Okrajový potenciál je a vrcholový potenciál je . Podle stejné logiky a . Myšlenkou vylepšení je hledat v pomocné síti vrchol s minimálním kladným potenciálem a pomocí front vybudovat blokovací tok přes něj .

Vstup : Síť . Výstup : maximální průtok .
  1. Nainstalujte pro každý .
  2. Vytvořit z grafu . Pokud , zastavte a vystupte .
  3. Nainstalujte pro každý .
  4. Určete potenciál každého vrcholu.
  5. Dokud existuje vrchol takový, že :
    1. Definujte tok pomocí dopředného šíření z .
    2. Určete tok pomocí zpětného šíření z .
    3. Doplňte stream o proudy a .
  6. Rozšiřte tok o tok a přejděte ke kroku 2.

Algoritmy dopředného a zpětného šíření slouží k nalezení cest z do az do . Příklad algoritmu přímého šíření pomocí front:

Vstup : Pomocná síť , vrchol takový, že . Výstup : Tok od zdroje k vrcholu , který je součástí blokujícího toku.
  1. Instalovat pro všechny : .
  2. Nainstalujte a .
  3. Přidat do fronty .
  4. Dokud fronta není prázdná:
    1. Nastavte hodnotu na poslední prvek fronty.
    2. ahoj :
      1. Pro každou hranu :
      2. .
      3. Aktualizovat .
      4. Aktualizovat .
      5. Nainstalujte .
      6. Pokud a vyřadit z fronty _

Vzhledem k tomu, že v každé iteraci hledání blokujícího toku je "nasycen" alespoň jeden vrchol, je dokončován v nejhorších iteracích, z nichž každý bere v úvahu maximum vrcholů. Nechť je počet "nasycených" hran v každé -té iteraci hledání blokujícího vlákna. Pak je jeho asymptotická složitost , kde je počet vrcholů a počet hran v grafu. Asymptotická složitost Dinitzova algoritmu šíření je tedy rovna , protože blokovací tok může procházet nanejvýš vrcholy.

Literatura

Odkazy