/// <summary>
 /// Vyhľadaá trasu na grafe
 /// </summary>
 /// <param name="paZ">vychodrí bod</param>
 /// <param name="paDo">koncový bod</param>
 /// <param name="paDruhVozidla">alé je to vozidlo</param>
 /// <returns></returns>
 public static List <Hrana> NajdiTrasu(Poloha paZ, Poloha paDo, DruhVozidla paDruhVozidla)
 {
     aHernaPlocha = Hra.DajInstanciu().DajHernuPlochu();
     aTrasa       = new List <Hrana>();
     aPolohaZ     = paZ;
     aZacVrch     = NajdiZaciatocnyVrchol();
     aKonVrch     = NajdiCielovyVrchol(paDo);
     if (aZacVrch == null || aKonVrch == null)
     {
         return(null);
     }
     if (aZacVrch == aKonVrch)
     {
         return(aTrasa);
     }
     aZacVrch.NajkratciaVzdialenost = 0;
     aAktVrch            = aZacVrch;
     aAktVrch.Docastnost = false;
     PrejdiVystupnuHviezdu();
     Backtracking();
     aHernaPlocha.PovodnyStavVrcholov();
     if (!aTrasa.Any())
     {
         return(null);
     }
     return(aTrasa);
 }
        /// <summary>
        /// Vytvorenie trasy podľa grafu
        /// </summary>
        private static void Backtracking()
        {
            aTrasa.Clear();

            Vrchol druhy = aKonVrch;
            Vrchol prvy  = aKonVrch.Predchodca;

            if (druhy == null || prvy == null)
            {
                return;
            }
            bool pokracuj = true;

            while (pokracuj)
            {
                foreach (var item in aHernaPlocha.ZoznamHran)
                {
                    if (item.Vrchol2 == druhy && item.Vrchol1 == prvy)
                    {
                        aTrasa.Insert(0, item);
                        if (prvy == aZacVrch)
                        {
                            pokracuj = false;
                        }
                        break;
                    }
                }
                druhy = prvy;
                prvy  = druhy.Predchodca;
            }
        }
 /// <summary>
 /// vytvorenie novιho vrcholu 
 /// </summary>
 /// <param name="paPolicko">na ktorom polνθku</param>
 private void VyrvorVrchol(Policko paPolicko)
 {
     Vrchol vr;
     if (paPolicko.Vrchol == null)
     {
         vr = new Vrchol(paPolicko);
         paPolicko.Vrchol = vr;
         aZoznamVrcholov.Add(vr);
     }
     else
     {
         vr = paPolicko.Vrchol;
     }
     paPolicko.Hrana = null;
 }
        /// <summary>
        /// vytvαranie vrcholu napojenιho na hranu
        /// </summary>
        /// <param name="paPolicko">na ktorom polνθku</param>
        /// <param name="paPolickoVedlajsie">susednι polνθko</param>
        private void VytvorVrcholNapojenyNaHranu(Policko paPolicko, Policko paPolickoVedlajsie)
        {
            Vrchol vr;
            if (paPolicko.Vrchol == null)
            {
                vr = new Vrchol(paPolicko);
                paPolicko.Vrchol = vr;
                aZoznamVrcholov.Add(vr);
            }
            else
            {
                vr = paPolicko.Vrchol;
            }

            paPolicko.Hrana = null;
            paPolickoVedlajsie.Hrana.Vrchol2 = vr;
        }
 /// <summary>
 /// Vytvorenie vrcholu vedΎa vrchoku
 /// </summary>
 /// <param name="paPolicko">policko</param>
 /// <param name="paPolickoVedlajsie">susedne policko</param>
 private void VytvorVrcholVedlaVrcholu(Policko paPolicko, Policko paPolickoVedlajsie)
 {
     Vrchol vr;
     if (paPolicko.Vrchol == null)
     {
         vr = new Vrchol(paPolicko);
         paPolicko.Vrchol = vr;
         aZoznamVrcholov.Add(vr);
     }
     else
     {
         vr = paPolicko.Vrchol;
     }
     paPolicko.Hrana = null;
     Hrana hr = new Hrana();
     hr.Vrchol1 = paPolickoVedlajsie.Vrchol;
     hr.Vrchol2 = vr;
     aZoznamHran.Add(hr);
 }
        /// <summary>
        /// Metoda kontroluje vystupnu hviezdu vrchola, ktorá je aktualny.
        /// Zistuje, porovnava a pripadne prepisuje vzdialenosti od vychodzieho vrchola
        /// </summary>
        private static void PrejdiVystupnuHviezdu()
        {
            Vrchol druhyVrch;
            int    vzdialenostPred;
            int    dlzkaPristupu;

            foreach (var item in aHernaPlocha.ZoznamHran)
            {
                if (item.Vrchol1 == aAktVrch && item.Vrchol2 != null)
                {
                    druhyVrch       = item.Vrchol2;
                    vzdialenostPred = druhyVrch.NajkratciaVzdialenost;
                    dlzkaPristupu   = item.DajHodnotu() + aAktVrch.NajkratciaVzdialenost;

                    if (dlzkaPristupu < vzdialenostPred)
                    {
                        druhyVrch.NajkratciaVzdialenost = dlzkaPristupu;
                        druhyVrch.Predchodca            = aAktVrch;
                    }
                }
            }
            Vrchol novy = ZistiKtorymPokracovat();

            if (novy == null)
            {
                return;
            }

            aAktVrch            = novy;
            aAktVrch.Docastnost = false;

            if (aKonVrch.Docastnost)
            {
                PrejdiVystupnuHviezdu();
            }
        }