//Eva Bílahorková //A04433 //12.5.2005 //kroužek 8 import java.util.*; import java.io.*; class FPolozka{ //položka k frontě FPolozka dalsi; int klic; FPolozka(int klicek){ //konstruktor klic=klicek; } } class Fronta{ FPolozka zacatek, konec; boolean jePrazdna(){ //testování jestli je něco ve frontě return (zacatek==null); } void pridej(int klic){ //metoda, přidání něčeho do fronty FPolozka novy=konec; konec=new FPolozka(klic); //přidání FPolozky na konec if(zacatek==null) zacatek=konec; else novy.dalsi=konec; //v případě prázdného začátku, začátek se rovná konci, jinak předchozím.dalším ukážeme na konec } int vyber(){ //vyber prvek int v=zacatek.klic; zacatek=zacatek.dalsi; return v; } } class Mesto { String mesto; //parametry int cas; Vlak vlaky; Mesto(String nmesta){ //konstruktor mesto=nmesta; cas=-1; //potřebujeme udělat nekonečno v případě nedoražení do města } } class Vlak { //soused v grafu pojmenovaný vlak int odjezd,djizdy,cstanice; //parametry Vlak dalsi; Vlak(int cilstanice,int odj,int dobjizdy,Vlak v){ //konstrtuktor cstanice=cilstanice; //cílová stanice odjezd=odj; //kdy to odjíždí djizdy=dobjizdy; //doba jízdy dalsi=v; //ukazatel na další vlak, na dalšího souseda vrcholu } } class Graf { Mesto[] mesta; //pole měst int litry; //počet potřebných litrů pro upíra Graf() { //konstruktor mesta=new Mesto[100]; //vytvořili jsme pole o velikosti 100 měst } void pvlak(String zstanice, String cstanice, int odj, int djizdy) { //přidávání vlaku do grafu int pocitadlo; //proměnná pocitadlo = pozice původního města, odkud vyjíždí - číslo v poli, reprezentující ten vrchol int pocitadlo2; //proměnná pocitadlo = pozice města, kam jede if ((odj>6 && odj<18) || djizdy>12 || ((odj+6+djizdy)%24>12)) return; //podmínky odjezdů, ze zadání for(pocitadlo=0;pocitadlo<100;pocitadlo++) { //cyklus pro zjištění pozice zdrojové stanice v poli měst if (mesta[pocitadlo]==null) { mesta[pocitadlo]=new Mesto(zstanice); break; } //v případě, že najdeme, že město se v poli nevyskytuje, přidáme ho tam else if (mesta[pocitadlo].mesto.equals(zstanice)) break; //v případě, že se tam vyskytuje, vyskočí z cyklu a v proměnné počitadlo, bychom měli mít pozici města } for(pocitadlo2=0;pocitadlo2<100;pocitadlo2++) { // vyhledáme pozici cílové stanice v poli měst if (mesta[pocitadlo2]==null) { mesta[pocitadlo2]=new Mesto(cstanice); break; } else if (mesta[pocitadlo2].mesto.equals(cstanice)) break; } mesta[pocitadlo].vlaky=new Vlak(pocitadlo2,(odj+6)%24,djizdy,mesta[pocitadlo].vlaky); //přidá vlak do vrcholu, odkud vyjíždí } void pocitej(String zstanice, String cstanice){ //vypočítáme, kolik upír potřebuje litrů na cestu Fronta fronta; Vlak v; int i, y, z, pcas; fronta=new Fronta(); for(i=0;i<100;i++){ if (mesta[i].mesto.equals(zstanice)) { break; } } //získáme pozici města odkud upír pojede for(y=0;y<100;y++){ if (mesta[y].mesto.equals(cstanice)) { break; } } //cílová stanice mesta[i].cas = 0; //čas, zdrojové stanice nastavíme na nulu fronta.pridej(i); //přidáme do fronty vrchol odkud budeme vyjíždět while(!fronta.jePrazdna()){ //vyzkoumáme, jestli je fronta prázdná z=fronta.vyber(); //projedeme prvky for(v=mesta[z].vlaky;v!=null;v=v.dalsi){ //projedeme všechny vlaky u vrcholu pcas=24*(mesta[z].cas/24)+v.odjezd+v.djizdy; //čas doražení do vrcholu, s tím, že počítáme celkový uražený čas if (v.odjezdpcas || mesta[v.cstanice].cas==-1){ mesta[v.cstanice].cas=pcas; // ukládání času v případě, že vypočítaný čas je menší než ten zapsaný fronta.pridej(v.cstanice);} } } if (mesta[y].cas==-1) litry=-1; else litry=mesta[y].cas/24; //testování už cílové stanice, pokud nelze dorazit do cílové stanice, potom litry = -1, jinak vypočítáme potřebné množství krve z času } } class Main { //hlavní třída static String ReadWord() { //čtení řádky ze standardního vstupu String slovo; slovo = new String(); int znak; try { //musíme ošetřit výjimky, které můžou nastat while (true) { znak = System.in.read(); //přečtení znaku if (znak==13) znak = System.in.read(); if (znak==10||znak==32) break; slovo=slovo+(char)znak; } } catch (Exception e) { //konec try e.printStackTrace(); slovo = ""; } return slovo; //vrátíme řádku } public static void main(String[] args) { //hlavní metoda Graf upir; String slovo1; String slovo2; String slovo3; String slovo4; int p,p2,i,y; slovo1=ReadWord(); //načteme řádku p = Integer.parseInt(slovo1); //první řádku převedeme na číslo for(i=1;i<=p;i++){ //testujeme počet potřebných případů upir = new Graf(); //v každém případě, vytvoříme nového upíra slovo1=ReadWord(); //zase načtem p2 = Integer.parseInt(slovo1); //počet vlaků, zase převedeme na číslo for(y=1;y<=p2;y++){ //projedeme pro p-krát vlaků slovo1=ReadWord(); //načtem stanici, odkud vlak vyjíždí slovo2=ReadWord(); //načtem stanici, kam vlak jede slovo3=ReadWord(); //načtem, v kolik vlak jede slovo4=ReadWord(); //načtem, jak dlouho pojede upir.pvlak(slovo1,slovo2,Integer.parseInt(slovo3),Integer.parseInt(slovo4)); //vložíme vlak } slovo1=ReadWord(); //načtem stanici, odkud upír pojede slovo2=ReadWord(); //načtem stanici, kam upír pojede upir.pocitej(slovo1,slovo2); //počítáme litry krve ze zdrojové do cílové stanice System.out.println("Test Case "+i+"."); //výpis čísla testu if (upir.litry==-1) System.out.println("There is no route Vladimir can take."); //pokud nelze dorazit do cílové stanice, zobrazíme tuto hlášku else System.out.println("Vladimir needs "+upir.litry+" litre(s) of blood."); // jinak zobrazíme mnoužství potřebné krve } } }