prehladavanie stromu do hlbky

Programovacie jazyky, rady, poradňa...
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

prehladavanie stromu do hlbky

Príspevok od používateľa beluský »

Ako najst vsetky mozne cesty z jedneho uzla stromu?

Viem najst jednu, ale problem je ten, ze ja potrebujem vsetky...
Pouzivam klasicke prehladavanie do hlbky:

Kód: Vybrať všetko

preskumaj(Vrchol v) {
  oznac v ako preskumany;
  pre vsetky vrcholy susediace s v: Vrchol k {
    ak k nie je este preskumany
      preskumaj(k);
  }
}
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Re: prehladavanie stromu do hlbky

Príspevok od používateľa neutronmind »

No takisto s pomocou DFS (prehladavanie do hlbky) mozes najst aj vsetky mozne cesty z nejakeho vrcholu. Z definicie stromu (suvisly acyklicky graf) vyplyva, ze z kazdeho vrcholu v existuje prave jedna cesta do kazdeho ineho vrcholu. Vsetkych roznych ciest z vrcholu v je teda |V|-1 (kde V je mnozina vrcholov).
Implementacia je jednoducha - pre kazdy vrchol si zapamatas jeho predchodcu pri DFS (koren treba osetrit specialne). Po DFS vypises cestu do kazdeho vrchola v tak, ze prebublas z neho az do korena (prejdes do jeho predchodcu, potom do predchodcovho predchodcu atd.). Takto ziskas cestu z kazdeho vrcholu do korena, ty to chces naopak, takze ju staci reverznut, pripadne ukladat predchodcov na zasobnik.
DFS je O(V), hladanie samotnych ciest je vsak az kvadraticke (ak ma strom podobu spajaneho zoznamu). Lepsie sa to uz asi neda, ked si uvedomis, ze mas O(V) roznych ciest, pricom kazda ma dlzku O(V). :)
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Re: prehladavanie stromu do hlbky

Príspevok od používateľa beluský »

ja to potrebujem aplikovat na sachovnicu.. a najst vsetky mozne cesty kona, tak aby preskakal vsetky policka (znamy problem, ja viem ;) ) a to nie je graf acyklicky..
neutronmind
Expert
Expert
Príspevky: 189
Registrovaný: 05 aug 2008, 14:17

Re: prehladavanie stromu do hlbky

Príspevok od používateľa neutronmind »

Tak potom to nie je strom, ako si napisal v nazve temy :)
Myslim, ze toto sa da jedina backtrackom (teda preskusas vsetky mozne cesty), skus porozmyslat nad nejakou heuristikou.
Zaklad by vyzeral asi takto:

Kód: Vybrať všetko

oznac aktualny vrchol za navstiveny
ak sme vyplnili celu sachovnicu, vrat true
chod do vsetkych naslednikov, kt. su nenavstiveni
oznac vrchol za nenavstiveny a vrat sa naspat
Rozdiel medzi tymto a klasickym DFS je ten, ze tu mozme navstivit jeden vrchol viackrat (teda pri neuspesnom pokuse sa z neho vratime a oznacime ho za nenavstiveny). Nakodit to uz snad zbladas...
ivetas
Novice
Novice
Používateľov profilový obrázok
Príspevky: 3
Registrovaný: 19 mar 2010, 22:51

Re: prehladavanie stromu do hlbky

Príspevok od používateľa ivetas »

...presne tuto ulohu som musela naprogramovat na skuske, ked to este potrebujes mozem ti sem hodit zdrojak...mam to v pascale, ak ti to nevadi...
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Re: prehladavanie stromu do hlbky

Príspevok od používateľa beluský »

uz to mam, ale diky :)
Napísať odpoveď