#include #include using namespace std; class range {private: struct I{int x;int operator*(){return x;}bool operator!=(I& lhs){return x s(v), t(v), y(v), m(v); for(int i : range(v)) { scanf("%d", &s[i]); } for(int i : range(v)) { scanf("%d", &t[i]); } for(int i : range(v)) { scanf("%d", &y[i]); } for(int i : range(v)) { scanf("%d", &m[i]); } vector route(v); vector> path(n, vector(v)), time(n, vector(v)), cost(n, vector(v)); for(int i : range(n)) { for(int j : range(v)) { path[i][j] = time[i][j] = cost[i][j] = inf; } } for(int i : range(v)) { s[i]--, t[i]--; path[s[i]][route[s[i]]] = t[i]; time[s[i]][route[s[i]]] = m[i]; cost[s[i]][route[s[i]]] = y[i]; route[s[i]]++; } // iの街までj円以下で行くのに最短dp[i][j]分 vector> dp(n, vector(c+1)); for(int i : range(n)) { for(int j : range(c+1)) { dp[i][j] = i==0 ? 0 : inf; } } // iの街からjの道を通って行く for(int i : range(n)) { for(int j : range(v)) { int dest = path[i][j]; // 道がない if(dest == inf) { continue; } // iの街までk円かかった for(int k : range(c+1)) { if(k + cost[i][j] <= c) { // iの街までk円かかって、iの街からjの道を通ってdestの街に行くときの話。 // destの街へはk+cost[i][j]円かかる。 // iの街からdestの街へは(jの道を通るので)time[i][j]分かかる。 dp[dest][k+cost[i][j]] = min(dp[dest][k+cost[i][j]], dp[i][k] + time[i][j]); } } } } int res = dp[n-1][c]; if(res == inf) { res = -1; } printf("%d\n", res); return 0; }