#include #include struct keiro { int S; int T; int Y; int M; }; int cmp(const void* a, const void* b) { struct keiro *c = (struct keiro*)a; struct keiro *d = (struct keiro*)b; if (c->S == d->S) { return (c->T - d->T); } else { return (c->S - d->S); } } int main() { int N, C, V, i; struct keiro *keiro; scanf("%d", &N); scanf("%d", &C); scanf("%d", &V); keiro = (struct keiro*)malloc(sizeof(struct keiro)*V); for (i=0; ino = 1; mati_p->Y = C; mati_p->M = 0; mati_p->keiro_i = 0; mati_p->keiro_n = keiro_start[mati_p->no - 1].renge; mati_p->keiro = keiro_start[mati_p->no - 1].keiro; struct mati *mati_from = 0; while (mati_p->keiro != 0 && mati_p->Y >= 0 && mati_p->M < jikan) { mati_from = mati_p; mati_p++; mati_p->no = mati_from->keiro->T; mati_p->Y = mati_from->Y - mati_from->keiro->Y; mati_p->M = mati_from->M + mati_from->keiro->M; mati_p->keiro_i = 0; mati_p->keiro_n = keiro_start[mati_p->no - 1].renge; mati_p->keiro = keiro_start[mati_p->no - 1].keiro; } while (1) { if (mati_p->no == N) { if (mati_p->Y >= 0) { if (mati_p->M < jikan) { jikan = mati_p->M; } } } while (1) { if (mati_p == mati) { goto END; } else { mati_p--; mati_p->keiro_i++; if (mati_p->keiro_i < mati_p->keiro_n) { mati_p->keiro++; break; } else { continue; } } } while (mati_p->keiro != 0 && mati_p->Y >= 0 && mati_p->M < jikan) { mati_from = mati_p; mati_p++; mati_p->no = mati_from->keiro->T; mati_p->Y = mati_from->Y - mati_from->keiro->Y; mati_p->M = mati_from->M + mati_from->keiro->M; mati_p->keiro_i = 0; mati_p->keiro_n = keiro_start[mati_p->no - 1].renge; mati_p->keiro = keiro_start[mati_p->no - 1].keiro; } } END: if (jikan == check_jikan) { printf("%d\n", -1); } else { printf("%d\n", jikan); } return 0; }