/// <summary> /// Rekurzivní prohledávání haldy (procházení grafu/lesa apod). Cílem je nalezení nejratší cesty v daném grafu. /// </summary> //rekurzivni prohledani haldy aby to spojilo cesty s naslednyma, //aby to prochazelo prioritni frontu dokad je co prochazet public void ProjdiGraf() { Cesta dosavadniProjitaCesta = prioritniFronta.OdeberPrvek(); if (dosavadniProjitaCesta == null) { return; } //v hranate zavorce je x-ty prvek listu - tady je to ten posledni, posledni projita cesta, tady h DataHran h = dosavadniProjitaCesta.NavstiveneHrany.Count == 0 ? null : dosavadniProjitaCesta.NavstiveneHrany[dosavadniProjitaCesta.NavstiveneHrany.Count - 1]; foreach (DataHran obecnaHrana in ag.VratIncidentniHrany(dosavadniProjitaCesta.AktualniVrchol)) { // preskoci cestu po ktere jsme prisli if (obecnaHrana == h) { continue; } // TODO: pokud bude potreba, mohou se vynechat cesty polomu viz kod nize. // Je potreba dodat tlacitka pripadne // if (obecnaHrana.JeFunkcniCesta == false) // { // continue; // } // Informace je nositel informace, ktera je prioritizovana, tady treba cesta // hledam, ktery vrchol se pouzije jako naslednik if (dosavadniProjitaCesta.AktualniVrchol == obecnaHrana.PocatekHrany) { VlozCestuDoFronty( obecnaHrana.KonecHrany, obecnaHrana, dosavadniProjitaCesta.CenaCeleCesty + obecnaHrana.DelkaHrany, dosavadniProjitaCesta); } else if (dosavadniProjitaCesta.AktualniVrchol == obecnaHrana.KonecHrany) { VlozCestuDoFronty( obecnaHrana.PocatekHrany, obecnaHrana, dosavadniProjitaCesta.CenaCeleCesty + obecnaHrana.DelkaHrany, dosavadniProjitaCesta); } } //pridam do listu vyresenych vrcholu VrcholyUzVyresene.Add(dosavadniProjitaCesta.AktualniVrchol); ProjdiGraf(); }
public IEnumerable <DataHran> VratIncedencniHrany(string klicVrcholu) { return(ag.VratIncidentniHrany(klicVrcholu)); }