Ciele cvičení:
Ručne (na tabuli) alebo pomocou vizualizačného appletu odsimulujte výpočet Bellman-Fordovho a/alebo Dijsktrovho algoritmu.
Bellman-Fordov a Dijsktrov algoritmus vypočítajú pre každý vrchol grafu dĺžku najkratšej cesty z vybraného štartovacieho vrcholu do daného vrcholu. Možno len z tejto informácie skonštruovať najkratšiu cestu (postupnosť vrcholov) zo štartovacieho vrcholu do ľubovoľného vrcholu grafu? Aká je efektívnosť tohto postupu?
Navrhnite spôsob, ako upraviť Bellman-Fordov a Dijsktrov algoritmus z prednášky tak, aby ste nielen vypočítali dĺžku najkratšej cesty, ale aj informáciu, pomocou ktorej je možné efektívne zrekonštruovať cestu (pre každý vrchol jeho predchodcu na najkratšej ceste)
Reimplementujte algoritmy z prednášky (Bellman-Fordov, Dijkstrov a Floyd-Warshalov) tak, aby pracovali s grafom, ktorý je interne uložený v matici susednosti (ohodnoteného grafu). Ako budete uchovávať neprítomnosť hrany (ako to záleží od predpokladu ohodnotenia hrán)?
Všetky algoritmy prezentované na prednáške fungujú len pre orientované grafy. Navrhnite, ako by trebalo upraviť tieto algoritmy (eventuálne bez úpravy vstupných grafov) tak, aby fungovali aj pre neorientované grafy.
Navrhnite úpravu Floyd-Warshalovho algoritmu tak, aby ste pri požiadavke na "vypísanie" najkratšej cesty medzi 2 vrcholmi vedeli túto cestu efektívne zrekonštruovať (2 možnosti, rozdiskutujte obe).
Rozdiskutujte dôkaz fungovania Dijkstrovho algoritmu (slidy, ktoré neboli na prednáške)
Bellman-Fordov algoritmus funguje narozdiel od Dijkstrovho algoritmu aj pre hrany so zápornými ohodnoteniami, avšak je pomalší. Nech graf obsahuje orientovanú hranu so záporným ohodnotením a nech X je najmenšie ohodnotenie hrany v takomto grafe (X < 0). Ak ku všetkým hranám grafu prirátame ohodnotenie |X|+1 (t.j. nové ohodnotenie hrany c(e) = c(e) + |X| + 1), všetky hrany grafu budú mať kladné ohodnotenie. Na takýto graf aplikujeme rýchlejší Dijkstrov algoritmus a získame najkratšie cesty v grafe (prirodzene na to, aby sme našli ohodnotenie cesty s k hranami, musíme od jej ohodnotenia odrátať hodnotu k*(|X|+1)
). Je toto tvrdenie správne? Zdôvodnite, resp. nájdite kontrapríklad.
Ako sa správa Bellman-Fordov algoritmus, ak majú všetky hrany zápornú cenu? Je treba na takéto "zlé" fungovanie mať všetky hrany záporné, alebo stačí orientovaný cyklus, ktorého súčet ohodnotení hrán je záporný?
Uvažujme jednoduchú bludiskovú hru v 2-rozmernej mriežke - presne takú, ako bola v 3. prednáške. Avšak okrem "prekážkových" políčok (stien) si pridajme do hracej plochy aj tzv. "spomaľovacie" políčka. Spomaľovacie políčko spôsobí, že vždy, keď na neho vstúpime, "panáčik" musí na tomto políčku ostať stáť ("je zmrazený") zadaný počet sekúnd. Pre každé spomaľovacie políčko môže byť definovaný iný čas, koľko tam musíme ostať stáť. Vytvorte program, ktorý pre zadanú štartovaciu pozíciu "panáčika" a pozíciu východu z bludiska nájde najrýchlejšiu cestu z bludiska.