Hlavná myšlienka

Fyzikálne riešenie

Predstavme si, že do vrcholu $A$ tečie neobmedzene veľa vody, ktorá sa šíri po hranách grafu. V čase $0$ je pod vodou iba $A$. V čase $1$ budú zatopené všetky vrcholy vzdialené od $A$ presne $1$, v čase $2$ budú zatopené tie vzdialené $2$, ... (Vrchol je zatopený, ak v predchádzajúcej jednotke času nebol pod vodou, ale teraz už je.)

V momente, keď je zatopené $B$, môžeme skončiť: čas zatopenia je hľadaná vzdialenosť. Ak $B$ nikdy nezatopíme, tak sa tam z $A$ nevieme dostať.

Formálnejšie...

...zostrojujeme vrecia $M_0,M_1,M_2,\dots$, pričom Mk obsahuje práve tie vrcholy, ktorých vzdialenosť od $A$ je práve $k$. (Obsahuje teda práve vrcholy, ktoré sú zatopené v čase $k$.)

Ak poznáme $M_k$, tak $M_{k+1}$ vieme získať tak, že volíme postupne každý vrchol v $M_k$, a rozšírime sa z neho: do $M_{k+1}$ pridáme všetky vrcholy, do ktorých vedie hrana zo zvoleného vrcholu, a ktoré ešte neboli zatopené. (To zodpovedá tomu, že si zvolíme vrchol zatopený v predchádzajúcom čase, a zatopíme všetky vrcholy, do ktorých vedie hrana zo zvoleného vrcholu, a ktoré ěste neboli zatopené.)

Je jasné, že takýmto spôsobom dostaneme iba vrcholy so vzdialenosťou $k+1$. Dostaneme ale všetky také vrcholy?

Áno, a dôvod je nasledovný:

Zoberme si ľubovoľný vrchol $C$ z $M_{k+1}$ (teda jeho vzdialenosť od $A$ je $k+1$). Nájdeme vrchol z $M_k$, z ktorého keď sa rozšírime, zatopíme $C$.

Kedže má vrchol $C$ vzdialenosť od $A$ rovnú $k+1$, existuje cesta z $A$ do neho dlhá $k+1$. Hľadaným vrcholom je napríklad predposledný vrchol na tejto ceste:

  • Vedie z neho hrana do $C$, takže keď sa z neho rozšírime, zatopíme $C$.
  • Vieme sa doňho dostať z $A$ na $k$ krokov, takže jeho vzdialenosť je najviac $k$. Jeho vzdialenosť ale nemôže byť menšia ako $k$, lebo z neho vedie hrana do $C$, a vedeli by sme sa tak dostať z $A$ do $C$ na menej ako $k+1$ krokov, čo by bol spor. Takže jeho vzdialenosť je presne $k$ -- je to teda vrchol z $M_k$.