Informatika gyűjtemény

Egy szinttel feljebb Megoldás

2004050607080910

NézetNyomtat

Megoldás

Algoritmus

(IOI 2006, 2. nap, 1. feladat, hivatalos megoldás)
Tegyük fel, hogy az x városból indul az útvonal. A következő állomás csak x jobb vagy bal szomszédja lehet, minden más "él" két olyan részre vágná a tópartot, amelyek között már csak úgy lehetne összeköttetés, ha az metszené valamelyik korábbi élet.
A gondolatmenet hasonló módon folytatható az útvonal további városaira. Minden új város szomszédos kell legyen az eddig összekötött városokkal. Tehát az útvonal felépítésekor mindig két lehetőség közül választhatunk. (Gyüre Balázs megoldása csak ennyit használ, és az első néhány tesztesetre a "nyers erő" algoritmus is eredményt ad.)
Vegyük észre, hogy ha néhány várost már összekötöttünk, és az útvonal y-ban végződik, akkor a városok összekötési sorrendje nem számít. Például ha a 2,3,4 és 5 városokat kötöttük eddig össze, és az útvonal 5-ben végződik, akkor mindegy, hogy az eddigi sorrend (2-3-4-5), (3-2-4-5) vagy (4-3-2-5), most az 1 vagy a 6 következhet. Ez a jelenség a dinamikus programozás módszerét juttathatja eszünkbe. Az alább részletezett megoldás már polinomiális algoritmust ad mind az eldöntésre, mind az útvonal meghatározására. (Mészáros Balázs megoldása ezt a hatélonyabb algoritmust implementálja.)
Egy tetszőleges (u,v) város párra legyen bal(u,v) igaz, ha az u-v éltől balra lévő városok összeköthetők olyan nem metsző útvonallal, amely v-ben végződik és u-t is tartalmazza. Hasonló módon definiáljuk jobb(u,v)-t is.
Legyen minden i-re bal(i,i)=jobb(i,i)=igaz. A következő rekurziók egyszerűen igazolhatók:
  • bal(u,v)=(jobb(u,v-1) és van_él(v-1,v)) vagy (jobb(v-1,u) és van_él(u,v))
  • jobb(u,v)=(jobb(u,v+1) és van_él(v+1,v)) vagy (bal(v+1,u) és van_él(u,v))
Akkor van megoldása a feladatnak, ha van olyan (i,j) város pár, amire jobb(i,j)=bal(i+1,j)=igaz. Ilyenkor a városok sorrendje a fenti rekurzió végigkövetésével megadható.

Kódok

mexico0.c (Mészáros Balázs, C) Csak az eldöntési rész.
mexico.c (Mészáros Balázs, C) A teljes megoldás.
mexico.cs (Gyüre Balázs, C#)