Feladat: Adott egy város, benne metrók és állomások. Írjunk algoritmust amely megszámolja hogy mennyi az a legkevesebb átszállás amellyel egy tetszőleges metróállomásból eljuthatunk egy másikba. Módszer: A feladathoz használjunk élszínezett ( szín egy metró), irányítatlan („oda- vissza” közlekednek), súlyozatlan ( szomszédos megálló távolsága 1) gráfot. Jelölések: w:érkezés helyszíne M:={B 1..B m B i metróvonal} (Tehát M =m) A:={A j A j állomás}; V A: a végállomások halmaza L akt :=az aktuális állomáson választható metrók halmaza Műveletek: átszáll(b)- az aktuális állomáson átszállok (vagy ha ez az első alkalom, akkor felszállok) a b (akt.metró b M) metróra, utána frissítődik az aktuállis metró megy(i,j) - az aktuális metróval az i {bal, jobb} irányba j>0 db megállót megyek, utána frissítődik az aktuállis állomás Két ‘alapirány’ van, melyek előre logikusan ki vannak osztva.
A megoldásom: Induljunk el a kezdő állomásról. Menjünk végig azon metrók állomásain amelyet átszállás nélkül tudok elérni. Ha közben elértük a célt: ha nem értük el: Menjünk végig azon metrók állomásain amelyet 1 átszállásból tudok elérni és korábban még nem szálltam rá fel. Ha közben elértük a célt: ha nem értük el: Menjünk végig azon metrók állomásain amelyet 2 átszállásból tudok elérni és korábban még nem szálltam rá fel. Ha közben elértük a célt: … (és így tovább amíg meg nem találtam meg, vagy amíg el nem fogynak a metrók) Egy metró útvonala (most) az alábbi 2 fajta lehet: … …… általános (azaz nincs benne kör) 2. körforgalom (azaz csak 1 teljes körből áll)
i:=0; l:= ; K:=M akt.állomás=w l:= SKIP i m l= Bejár(i) i:=i+1; K:=M l= Kiír(Nem lehet eljutni!)Kiír(‘i’ db átszállással) Eljut(w,A,M)Bejár(k) j:=0; z:= akt.állomás; L akt K b: L akt K; K:=K\{b} átszáll(b) akt.állomás V (j) (j=0 z akt.állomás) l= megy(jobbra,1); j:=j+1 k=0 akt.állomás=w Bejár(k-1) l:= SKIP z akt.állomás megy(balra,j); j:=0SKIP akt.állomás V (b) (j=0 z akt.állomás) l= megy(balra,1); j:=j+1 k=0 akt.állomás=w Bejár(k-1) l:= SKIP z akt.állomás megy(jobbra,j); j:=0SKIP L akt :=L akt \{b} L akt feltöltése; visszatérés az indulás helyszínére a korábban használt metrók is jók lehetnek a rekurziónál logikai vált. alapból hamis, igaz lesz ha megérkeztünk az összes lehetséges metróra felszálljunk ne szálljunk fel egy metróra többször logikai vált. alapból hamis, igaz lesz ha megérkeztünk körforgalomnál visszaérkeztünk végállomásnál visszaforduljunk körforgalomnál ne menjünk egy felesleges kört visszafelé
Példa (a számok: a kezdő állomásról min. hány átszállás kell az akt. csúcsba)