#include #include #include #include using namespace std; struct Edge { int to, money, time; }; // priority_queueで使うための状態. 時間が小さい方から出てくる. struct State { int city, money, time; bool operator>(const State& s) const { return time > s.time; } }; const int kINF = 1 << 28; const int kMAX_V = 60; const int kMAX_C = 310; const int kMAX_E = 1510; vector graph[kMAX_V]; int C, V, E; int S[kMAX_E], T[kMAX_E], Y[kMAX_E], M[kMAX_E]; // 始点, 終点, コスト, 時間 int cost[kMAX_V][kMAX_C]; // (都市, 使った料金) // この関数内で出力 void Dijkstra(int s) { fill((int* )cost, (int* )(cost + kMAX_V), kINF); cost[s][0] = 0; priority_queue, greater > que; que.push((State){s, 0, 0}); // (city, money, time) while (!que.empty()) { State s = que.top(); que.pop(); if (s.city == V - 1) { cout << cost[s.city][s.money] << endl; return; } if (cost[s.city][s.money] < s.time) continue; for (int i = 0; i < graph[s.city].size(); i++) { Edge e = graph[s.city][i]; if (s.money + e.money <= C && cost[e.to][s.money + e.money] > s.time + e.time) { cost[e.to][s.money + e.money] = s.time + e.time; que.push((State){e.to, s.money + e.money, s.time + e.time}); } } } cout << -1 << endl; } void Solve() { for (int i = 0; i < E; i++) { graph[S[i] - 1].push_back((Edge){T[i] - 1, Y[i], M[i]}); } Dijkstra(0); } int main() { cin >> V >> C >> E; for (int i = 0; i < E; i++) { cin >> S[i]; } for (int i = 0; i < E; i++) { cin >> T[i]; } for (int i = 0; i < E; i++) { cin >> Y[i]; } for (int i = 0; i < E; i++) { cin >> M[i]; } Solve(); return 0; }