• Nem Talált Eredményt

7.1. Tűzoltók

7.1.1. Egy nagyváros közepén található a tűzoltó állomás. Sajnos gyakran megesik, hogy a tűz helyszínére tartó tűzoltó autók nem azon az útvonalon haladnak, amerre a leghamarabb kiérnének, mivel a sofőrök nem képesek a legrövidebb utat meghatározni. Írjon útvonaltervező programot, amely egy mátrixban tárolt úthálózat alapján megtervezi a legrövidebb útvonalat a tűzoltó állomás és a tűz helyszíne között! Ötlet: használjon Dijkstra algoritmust!

7.2. Bolygóközi futárszolgálat

A Bolygóközi Kézbesítő Vállalat különböző bolygók között bonyolít le szállításokat. Mivel a távolságok hatalmasak, ezért a közlekedést térkapukon keresztül oldják meg. Az egyes bolygók közelében féregjárat nyílások helyezkednek el, minden járat egy másik bolygó közelében ér véget.

A közlekedés eme járatrendszerek belsejében zajlik. A járatok nyílásai a közeli bolygó kormányzatának a tulajdonában állnak, így a járatba való belépésért díjat szednek. A járat használatáért fizetendő összeg függ a belépési pontot birtokló kormányzattól, valamint a cél állomástól (a népszerűbb célállomások felé tartó járműveket jobban megsarcolják). Adott egy csillagtérkép, amelyen feltüntettük, hogy mely bolygók között létezik féregjárat, és az egyes járatokért mekkora díjat kell fizetni. A térkép adjacencia mátrixban van tárolva, ahol -1 jelzi azt, ha két bolygó között nincs közvetlen járat, egyébként pedig az egyes tarifákat tároljuk a mátrix celláiban.

7.2.1. Készítsen programot, amely beolvassa a csillagtérképet egy fájlból, majd határozza meg, hogy legolcsóbban mekkora összegért lehet szállítani a felhasználó által megadott két bolygó között! Adja meg a legolcsóbb úthoz tartozó útvonalat is! Ötlet: használjon Dijkstra algoritmust!

7.2.2. Kérjen be egy bolygó sorszámát, majd határozza meg, hogy a féregjáratokon keresztül hány bolygóhoz lehet onnan eljutni!

7.2.3. Határozza meg, hogy hány darab komponens található a csillagtérképen! Az egy komponensben lévő bolygók között létezik útvonal, két külön komponensben lévő bolygó között nem létezik. Adja minden komponensben, az ott található bolygók számát!

7.3. Oázisok

7.3.1. A Szahara egyik szegletében 11 oázis található. Nem mindegyik között van közvetlen út és az utak sokszor kacskaringósak, hogy elkerüljék a futóhomokot és más veszélyeket. 10 beduin törzs él külön oázisokban, a 11., a szent oázis lakatlan. A törzsek egyszer csak észreveszik, hogy mindegyikük oázisa a kiszáradás szélén áll.

Összegyűltek hát, hogy megoldást találjanak a problémára. A szent oázisban annyi víz van, amely képes elegendő vízzel ellátni a törzseket. Megállapodnak abban, hogy közösen építenek egy csővezeték rendszert az utak mellett, amelyen keresztül elegendő vízhez jut minden törzs. Ismerjük az oázisok közötti utak távolságát. Írjon programot, amely megtervez egy, az oázisokat összekötő csőhálózatot úgy, hogy a lehető legkevesebb cső felhasználásával minden kiszáradó oázis vízhez juthasson. A csövek

kapacitása elég nagy, tehát az egyszerre szállítandó víz mennyiségével nem kell foglalkozni. Ötlet: használjon Prim algoritmust!

7.4. Sörhálózat

A Kétfarkú Kutyapárt megnyerte a választásokat, így ígéretükhöz híven az ivóvíz hálózat mellé ingyen sör hálózatot alakítanak ki. Mindenkinek persze nem jut az ingyen sörből, de az év egy napján leállítják a vízszolgáltatást és a vízvezetékeken keresztül egy szerencsés kisorsolt városban megindul a sörszolgáltatás. A városok közötti vízvezetéknek ismert a szállítási kapacitása, valamint hogy az egyes vezetékek mely városokat kötnek össze. A hálózat egyik csomópontja a sörgyár.

7.4.1. Írjon programot, amely megmondja, hogy maximálisan mennyi sört lehet továbbítani a sörgyárból a kisorsolt városba, ehhez mely vezetékeket kell felhasználni és, hogy ezek a vezetékek milyen mértékben lesznek kihasználva! A program fájlból olvassa be a vezetékhálózatot és a felhasználótól kérdezze meg, hogy hol van a sörgyár és melyik a kisorsolt város! Ötlet: használjon Ford és Fulkerson algoritmust!

7.4.2. .Határozzuk meg, hogy ha csak egy városban lehet sörgyár (a helyét nem kötjük ki), akkor legfeljebb hány várost láthatunk el itallal? Ez azért fontos, mert a vezetékhálózat nem köt össze minden várost.

7.4.3. Írjon függvényt, amely meghatározza, hogy egy adott csomópontból hova lehet eljuttatni a legnagyobb mennyiségű sört, és mekkora ez a mennyiség!

7.5. Páros gráf

7.5.1. Döntsük el egy gráfról, hogy páros-e, ehhez segítségnek használjunk szomszédossági mátrixot és szélességi keresést! A szélességi keresés a gráf egy adott csúcsából kiindulva bejárjanak szomszédjait, ezután azok szomszédjait és így tovább. Az algoritmus implementációjában segíthet, ha a nem meglátogatott csúcsokat egy sor adatszerkezetbe rakjuk, a meglátogatni kívánt csúcsokat pedig kivesszünk ebből a listából és belerakjuk egy átmenetibe, így az algoritmust addig kell futtatni, míg van kivehető elem a sorból.

7.6. Belmann-Ford algoritmus

7.6.1. Valósítsuk meg a Bellman-Ford algoritmust egy gráfon! Az algoritmus egy irányított gráf adott pontjától keresi meg a minimális költségű utakat a gráf többi pontjába.

Először az egy, majd a kettő él hosszú legrövidebb utakat keresi meg és így tovább. Ha a gráf negatív kört tartalmaz, az algoritmus nem ad vissza jó értéket.

7.6.2. Számítsuk ki egy fa átmérőjét! Egy fa átmérője alatt a fa bármely két csúcsa között futó legrövidebb utak közül a leghosszabbat értjük. Ötlet: Ha lefuttatjuk a fa minden pontjára a Belmann-Ford algoritmust, akkor ebből már csak a legkisebb elemet kell kiválasztani.

7.6.3. Adott egy valuta átváltási táblázat (adjacencia mátrix). x valutát y-ra szeretnénk váltani, keressük meg azt az átváltási sorozatot, amelyben a legtöbb y valutát kapjuk. Nem biztos, hogy a direkt átváltás a legjobb. Pl.: 1 dollárért kapunk 2 eurót, azonban 1 dollárért kaphatunk 6 frankot is, 1 frankért fél dollárt, így a dollár – frank - euró lesz a legjobb átváltás. Az átváltási táblázat főátlója csupa egyes, hiszen 1 dollár átváltva

dollárra 1 dollárt kapunk. A főátlóra szimmetrikusan pedig egymás reciprokjai kell, hogy szerepeljenek, mert ha 1 euró = 2 dollár, akkor 1 dollár = 1/2 euró.

7.7. Kruskal algoritmus

7.7.1. Valósítsa meg a Kruskal algoritmust! Tárolja halmazban az épülő feszítőfa csúcsait!

Használja az UNIÓ, HOLVAN halmazműveleteket annak eldöntésére, hogy egy új él felvétele okoz-e kört a feszítőfában! Ötlet: Az algoritmus elején a gráf minden pontja egy önálló halmazt jelent. A HOLVAN művelet megadja, hogy egy elem, melyik halmazban található, az UNIÓ művelet két halmazt egyesít. Ha egy élet akarunk hozzáadni a feszítőfához, akkor meg kell vizsgálni, hogy az él két pontja ugyanabba a halmazba tartozik-e. Ha igen, akkor az él felvétele kört okozna, így a következő legkisebb súlyú élt kell vizsgálni. A halmazokat (nem bináris) fákkal reprezentáljuk. Az UNIÓ művelet két ilyen fát egyesít oly módon, hogy az első fa a gyökere a második fa gyökerének egy új gyereke lesz. A HOLVAN művelet megadja a fa gyökerét.

7.7.2. A minimális költségű feszítőfa helyett keresünk maximális költségűt! Egy kommunikációs hálózat tartalmazza a számítógépeket és az azok közötti kétirányú kapcsolatokat. Mindegyik kapcsolathoz sávszélesség tartozik. Bármely, két gépet összekötő hálózatrész sávszélessége alatt az egyes vezetékszakaszok sávszélességének minimumát értjük. Ha két gép között több úton is létesíthető kapcsolat, akkor az összeköttetés sávszélessége ezek közül a maximum. A teljes hálózat sávszélessége alatt az azt alkotó gépek közötti sávszélességek minimumát értjük. Ha a gráf nem összefüggő, akkor 0 a sávszélesség. Írjunk programot, amely beolvassa a hálózat adatait, majd meghatározza a sávszélességét!