5 - GPS
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
1000ms | 256MB |
Tajna komisija nema vremena ni za šta a samim tim ni za planiranje putovanja od svoje tajne baze do mesta održavanja SIO-a. Možemo pretpostaviti da se naša država sastoji od \(N\) gradova (numerisanih brojevima od \(1\) do \(N\)) i \(M\) dvosmernih auto-puteva između nekih od njih, pri čemu je za svaki auto-put poznato vreme potrebno da se on pređe. Komisija se nalazi u gradu broj \(1\) a SIO se održava u gradu broj \(N\).
Međutim, komisija vozi poslednje čudo tehnologije - Mazdu 323 sa ugrađenim auto-vozačem, sistemom za navigaciju (GPS), daljinskim blokiranjem auto-puteva i sertifikatom da je bolji automobil od Nissan Kaškaija. Jedna od (mnogih) mogućnosti ovog automobila je sledeća: ukoliko se trenutno nalazimo u gradu \(X\) i u GPS unesemo grad \(Y\), tada, ukoliko od grada \(X\) do grada \(Y\) postoji jedinstvena najkraća putanja (koja može koristiti više auto-puteva i prolaziti kroz više gradova), auto-vozač će nas odvesti tom jedinstvenom najkraćom putanjom do grada \(Y\). Nažalost, mi možemo koristiti GPS samo ako je neki od gradova \(X\) ili \(Y\) upravo \(1\) ili \(N\) (još uvek nije unešeno dovljno podataka). Naravno, osim korišćenja GPS-a/auto-vozača, moguće je voziti Mazdu na klasičan način. Takođe (videti opis mogućnosti Mazde), moguće je blokirati najviše jedan auto put pre početka putovanja i na taj način uticati na izračunavanja GPS-a.
Cilj komisije je da stigne iz grada \(1\) do grada \(N\) za najkraće moguće vreme (prvi prioritet) ali da pritom što manje vremena vozi na klasičan način, bez GPS-a (drugi prioritet). Na vama je da izračunate koliko najmanje vremena se Mazda mora voziti na klasičan način, pri čemu možete odlučiti da li ćete u obzir uzimati mogućnost blokiranja auto-puta (videti opis funkcije i bodovanje).
Opisi funkcija
Potrebno je da implementirate funkciju
- \(NajkracaVoznja(N,M,g1[…],g2[…],t[…])\)
gde je \(N\) – broj gradova (gradovi su numerisani od \(1\) do \(N\)), \(M\) – broj auto-puteva a \(g1\), \(g2\) i \(t\) nizovi dužine \(M\) koji opisuju auto-puteve: za svako \(1\leq i\leq M\), \(i\)-ti auto-put povezuje gradove \(g1[i]\) i \(g2[i]\) i putovanje po njemu traje \(t[i]\) minuta. Auto-putevi su dvosmerni a svi nizovi su indeksirani od \(1\).
Za maksimalan broj poena, vaša funkcija mora da vrati jedan ceo broj – najmanje vreme koje komisija mora voziti na klasičan način ukoliko ima pravo da blokira najviše jedan auto put. Za manji broj poena, vaša funkcija može vratiti najmanje vreme koje komisija mora voziti na klasičan način ukoliko nema prava da blokira auto puteve; u tom slučaju je potrebno vratiti rezultat sa predznakom “-” (minus). Ukoliko je rešenje 0, ne mora se stavljati predznak.
Primer
Neka je \(N=8\), \(M=11\), \(g1=[1,1,5,3,3,4,6,6,4,1,8]\), \(g2=[5,3,7,7,4,7,2,8,6,2,2]\) i \(t=[12, 10, 5, 8, 10, 3, 2, 7, 3, 30, 5]\). Ovi podaci odgovaraju sledećoj mapi (gradovi su prikazani kao kružići a auto-putevi kao linije; pored svakog auto puta je dato vreme potrebno da se on pređe).
Najmanje vremena potrebno da se stigne iz grada 1 u grad 8 (bez obzira ko vozi) je 30 minuta. Razmotrimo slučaj kada ne blokiramo nijedan auto put: tada npr. možemo u GPS-u ukucati grad broj 7 (to je ok jer je \(X=1\)) i kako do njega postoji jedinstvena najkraća putanja (\(1\rightarrow 5\rightarrow 7\)) auto vozač će nas odvesti tamo. Zatim možemo da vozimo sami do grada 2 (\(7\rightarrow 4\rightarrow 6\rightarrow 2\), ukupno 8 minuta) a zatim možemo iz grada 2 ukucati u GPS grad 8 (dakle \(Y=8\) pa možemo koristiti GPS) i auto vozač nas vozi u grad 8 jedinstvenom najkraćom putanjom \(2\rightarrow 8\). Stigli smo do cilja za najkraće moguće vreme a pri tom smo sami vozili 8 minuta – može se pokazati da ne možemo bolje ukoliko ne blokiramo auto-puteve. Dakle, ukoliko vaša funkcija za ovaj primer vrati broj -8, dobijate 60% poena (vidi bodovanje).
Sa druge strane, ako želimo da koristimo funkciju blokiranja najviše jednog auto-puta, tada, ukoliko npr. blokiramo auto-put između 5 i 7, možemo pozvati GPS prvo za grad 2 (jedinstvena najkraća putanja \(1\rightarrow 3\rightarrow 4\rightarrow 6\rightarrow 2\)) a zatim iz grada 2 pozivamo GPS za grad 8. Ukupno smo sami vozili 0 minuta što je i optimalno rešenje za ovaj primer (i nosi 100% poena). Primetimo npr. da ne bi bilo korektno da uklonimo auto-put između 4 i 6 i odmah u GPS unesemo grad 8 jer bismo tada do njega stigli za 35 minuta a moramo stići za najkraće moguće vreme (30 minuta).
Ograničenja
- \(2\leq N\leq 10^5\)
- \(1\leq M\leq 3⋅10^5\)
- Za svako \(1\leq i\leq M\) važi \(1\leq g1[i],g2[i]\leq N\), \(g1[i]\neq g2[i]\) i \(1\leq t[i]\leq 10^9\)
- Između svaka dva grada postoji najviše jedan auto-put.
- Uvek će postojati način da se stigne iz grada \(1\) u grad \(N\).
Podzadaci i bodovanje
U svakom podzadatku, ukoliko vaš program korektno reši varijantu problema u kome nema blokiranja auto-puteva (što se zaključuje na osnovu predznaka “-“ u povratnoj vrednosti funkcije) dobijate 60% poena od odgovarajućeg podzadatka. Ukoliko svaki test primer podzadatka vaš program rešava u varijanti gde je moguće blokirati najviše jedan auto-put, dobijate svih 100% poena tog podzadatka.
- PODZADATAK 1 [11 POENA]: \(N\leq 10\)
- PODZADATAK 2 [17 POENA]: \(N\leq 250\) i \(M\leq 500\).
- PODZADATAK 3 [20 POENA]: \(N\leq 2000\).
- PODZADATAK 4 [21 POENA]: Za svako \(1\leq i \leq M\) važi \(t[i]=1\).
- PODZADATAK 5 [31 POENA]: Nema dodatnih ograničenja.
Detalji implementacije
Potrebno je da pošaljete tačno jedan fajl, pod nazivom gps.c, gps.cpp ili gps.pas, koji implementira gore pomenutu funkciju. Osim tražene funkcije, vaš fajl može sadržati i dodatne globalne promenljive, pomoćne funkcije i dodatne biblioteke.
Zavisno od programskog jezika koji koristite, vaša funkcija/procedura mora biti sledećeg oblika:
C/C++
long long NajkracaVoznja(int N, int M, int* g1, int* g2, int* t);
Pascal
function NajkracaVoznja(N, M : longint; var g1, g2, t : array of longint) : int64;
Ukoliko radite u C/C++-u, potrebno je na početku fajla staviti #include “gps.h”
a ukoliko radite u Pascal-u, potrebno je na početku fajla staviti Unit gps;
(ovo je već dodato u fajlovima koji su vam obezbeđeni).
Testiranje i eksperimentisanje
Uz zadatak, obezbeđeni su vam “template” fajlovi (gps.c, gps.cpp, gps.pas) koje možete koristiti i menjati po potrebi. Takođe su vam obezbeđeni programi (grader.c, grader.cpp, grader.pas) koji služe da lakše testirate kodove. Ovi programi učitavaju sa standardnog ulaza sledeće podatke:
- U prvom redu brojeve \(N\) i \(M\), redom, razdvojene razmakom
- U sledećih \(M\) redova brojeve \(g1[i]\),\(g2[i]\),\(t[i]\), redom, razdvojene razmakom
a zatim pozivaju vašu funkciju NajkracaVoznja iz odgovarajućeg fajla (gps.c, gps.cpp, gps.pas) sa učitanim parametrima i na kraju vrednost koju vaša funkcija vraća ispisuju na standardni izlaz. Kodove ovih programa možete menjati po potrebi.
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Nikola Milosavljević | Nikola Milosavljević | - | Aleksandar Ivanović |
05_gps.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
|