#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll; typedef unsigned long long ull; #define FOR(i,a,b) for(int (i)=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define RANGE(vec) (vec).begin(),(vec).end() using namespace std; class LoadShortcut { public: struct Edge { int to; int cost; int time; Edge(int t, int c, int ti) : to(t), cost(c), time(ti) {} }; void solve(void) { int N,C,V; cin>>N>>C>>V; vector> edges(N); { vector S(V), T(V), Y(V), M(V); REP(i, V) cin>>S[i]; REP(i, V) cin>>T[i]; REP(i, V) cin>>Y[i]; REP(i, V) cin>>M[i]; REP(i, V) edges[S[i]-1].emplace_back(T[i]-1, Y[i], M[i]); } // グラフは DAG なので DP で解ける const int inf = (1<<30); // dp[c][i] := 都市 i まで行くとき所持金が c 円になっているときの移動最小時間 vector> dp(C+1, vector(N, inf)); dp[C][0] = 0; // O(N*C) REP(i, N) REP(c, C+1) { for (const auto &e : edges[i]) { if (c >= e.cost && dp[c][i] < inf) dp[c-e.cost][e.to] = min(dp[c-e.cost][e.to], dp[c][i]+e.time); } } int ans = inf; REP(c, C+1) ans = min(ans, dp[c][N-1]); if (ans == inf) cout<<-1<solve(); delete obj; return 0; } #endif