/* S díky Romanu Smržovi*/ #include #include #define MAX_STANIC 1000 #define MAX_ZASTAVENI 1000 struct odjezd { int odkud, kam; int prijezd; /* čas příjezdu do další stanice */ int cena; /* cena cesty do další stanice */ int linka; struct odjezd *dalsi; }; struct prijezd { struct prijezd *odkud; /* předchozí zastávka */ int stanice; int cena; /* celková cena cesty do dané stanice */ int linka; struct prijezd *dalsi; }; int d,n,s,c; struct odjezd *odjezdy[1440]; struct prijezd *prijezdy[1440]; struct prijezd *cesty[MAX_STANIC]; /* Aktuálně nejlevnější cesta do dané stanice */ void vypsat_cestu(struct prijezd *p) { if (!p) return; vypsat_cestu(p->odkud); printf("stanice %d linka %d, ", p->stanice, p->linka); } int main(int argc, char *argv[]) { int i, j, t; struct prijezd *p; struct odjezd *o; scanf("%d %d %d %d\n", &d, &n, &s, &c); for (i=0; iodkud = mzst; odjezd->kam = szst; odjezd->linka = i+1; odjezd->cena = scena-mcena; odjezd->prijezd = scas; odjezd->dalsi = odjezdy[mcas]; odjezdy[mcas] = odjezd; mzst = szst; mcas = scas; mcena = scena; } } struct prijezd start = { 0, s, 0, -1000, NULL }; cesty[s] = &start; for (t = 0; t<24*60; t++) { /* Postupný průchod časem */ for (p = prijezdy[t]; p; p=p->dalsi) if (!cesty[p->stanice] || cesty[p->stanice]->cena > p->cena) cesty[p->stanice] = p; for (o = odjezdy[t]; o; o=o->dalsi) if (cesty[o->odkud] && cesty[o->odkud]->cena + o->cena <= d) { struct prijezd *prijezd = malloc(sizeof(struct prijezd)); prijezd->odkud = cesty[o->odkud]; prijezd->stanice = o->kam; prijezd->linka = o->linka; prijezd->cena = cesty[o->odkud]->cena + o->cena; prijezd->dalsi = prijezdy[o->prijezd]; prijezdy[o->prijezd] = prijezd; } if (cesty[c]) { /* Nalezli jsme cestu do cíle */ vypsat_cestu(cesty[c]); printf("\n"); return 0; } } printf("Cesta neexistuje\n"); return 0; }