1. Vytvořte třídu `Map`, která implementuje hledání nejkratší cesty v grafu pomocí Dijkstrova algoritmu.
2. Otestujte pomocí dodaných testerů (tzn. svůj kód pište přímo do dodaného souboru a následně zkuste spustit, dokud to neprojde bez chyb).
3. Implementujte naplnění jiné mapy dodanými linkami tramvají a prověřte funkčnosti dodanými testery (v souboru až za seznamy stanic tram linek).
## Třída `Map`
- *Vrcholy grafu* (názvy míst) jsou popsány pomocí stringu a jsou jednoznačné, nezáleží na velikosti písmen. Uvnitř datové struktury je vhodné ukládat všechny názvy vrcholů v malých písmenech (`.lower()`).
- *Ohodnocení hran* (vzdálenosti) je popsáno pomocí nezáporného čísla (`int`/`float`).
- Třída má konstruktor bez parametrů a 3 základní metody (níže).
- Třída má *konstruktor bez parametrů* a *3 základní metody* (níže).
- Je možné (a vhodné) přidat další pomocné metody.
## Povinné metody
### Povinné metody třídy `Map`
`add_single_connection(start, end, dist)`
- Přidá do naší mapy OBOUSMĚRNÉ spojení mezi `start` a `end` (stringy) se vzdáleností `dist`. Tzn. např. `add_single_connection("A", "B", 10)` přidá spojení `A->B` a zároveň `B->A` s délkou `10`.
- `start` a `end` může mít různou velikost písmen, ukládejte ale pro jednoduchost vše malými písmeny.
- `dist` musí být nezáporné číslo, jinak vyhoďte výjimku `ValueError` s vhodným textem.
- Pravidla jinak stejná jako pro `add_single_connection()`.
`find_route(start, end)`
- Vrátí dvojici `(dist, route)`, kde `dist` je hodnota nejkratší vzdálenosti mezi `start` a `end`
a `route` jen seznam (`list`) uzlů od `start` do `end` (včetně) tvořící nejkratší cestu (názvy uzlů vše malými písmeny).
- Pokud cesta neexistuje, vraťte `(None, [])`.
- Pokud `start` nebo `end` v mapě neexistuje, vyhoďte výjimku `ValueError` s vhodným textem.
## Poznámky k implementaci třídy
- Projďete si celý dodaný kód a řiďte se komentáři.
- Můžete použít 2D matici (seznam seznamů) jako na cviku a pak třeba `dict` pro mapování názvů na indexy.
- Vhodnější ale může být použít slovník slovníků. U prvního slovníku (`dict`) jsou klíče stringy (názvy počátečních uzlů) a hodnoty jsou další slovník (`dict`), kde klíče jsou cílový uzel a hodnota je vzdálenost. Např.:
- atd... Je to samozřejmě třeba udělat přes cykly a automaticky (ne to ručně zadávat v tomto formátu).
- Pak zkuste projití následujících testů.
## Nastavení dodaného kódu
- Nahoře ve zdrojáku jsou dvě proměnné pro lepší práci s testováním.
- `PRINT_RESULTS` je `bool`, který pro hodnotu `True` vypisuje výsledky hledaných tras nebo chyb. Na testování při programování je to vhodné.
- `TEST_ROUTE_NOT_EXIST` je `bool`, který pro `False` vypne testování neexistující trasy. Pro zápočet můžete nechat `False`. Pro zájemce o drobné rozšíření algoritmu lze nastavit na `True`.