#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define Rep(b, e, i) for(int i = b; i <= e; i++) #define Repr(e, b, i) for(int i = e; i >= b; i--) #define rep(n, i) Rep(0, n-1, i) #define repr(n, i) Repr(n-1, 0, i) #define all(v) (v).begin(), (v).end() #define pb(v) push_back(v) #define uniq(v) (v).erase(unique(all(v)),(v).end()) #define bitcnt(x) __builtin_popcount(x) #define fst first #define snd second #define Pqaz(T) priority_queue,greater> #define Pqza(T) priority_queue #define put(x) cout << x; #define putsp(x) cout << x << ' '; #define putln(x) cout << x << endl; #define ENJYU std::ios::sync_with_stdio(false);std::cin.tie(0); typedef long long ll; typedef pair llP; typedef pair intP; typedef pair P; typedef complex comp; typedef vector vec; typedef vector vecll; typedef vector vecd; typedef vector mat; typedef vector matll; typedef vector matd; //vector の中身を出力 template ostream &operator<<(ostream &o,const vector&v) {o<<"{";for(int i=0;i<(int)v.size();i++)o<<(i>0?", ":"")< adj[MAX_V]; mat adj2 (MAX_V, vec (MAX_V, 0)); int d[MAX_V], pre[MAX_V], rev[MAX_V]; void dijkstra(int s){ priority_queue, greater

> que; fill(d, d+V, INF); fill(pre, pre+V, -1); d[s] = 0; que.push(P(0, s)); while (!que.empty()) { P p = que.top(); que.pop(); int v = p.second; if (d[v] < p.first) continue; rep((int)adj[v].size(), i) { edge e = adj[v][i]; if (d[e.to] > d[v] + e.cost) { d[e.to] = d[v] + e.cost; que.push(P(d[e.to], e.to)); pre[e.to] = v; } } } } void solve(void){ int C, E; cin >> V >> C >> E; vec ss(V), ts(V), ys(V), ms(V); rep(E, i) { cin >> ss[i]; ss[i]--; } rep(E, i) { cin >> ts[i]; ts[i]--; rev[ts[i]]++; } rep(E, i) cin >> ys[i]; rep(E, i) cin >> ms[i]; rep(E, i) { adj[ss[i]].pb((edge{ts[i], ms[i]})); adj2[ss[i]][ts[i]] = ys[i]; } while(1) { dijkstra(0); if (d[V-1] == INF) { cout << -1 << endl; return; } int p = V-1, cost = 0; while (pre[p] != -1) { cost += adj2[pre[p]][p]; p = pre[p]; } //cout << cost << endl; if (cost <= C && p == 0) { cout << d[V-1] << endl; return; } p = V-1; while (pre[p] != -1) { if (rev[p] > 1) { rev[p]--; vector newadj; rep(E, i) { if (ss[i] == pre[p] && ts[i] != p) { newadj.pb((edge{p, ms[i]})); } } swap(newadj, adj[pre[p]]); break; } p = pre[p]; } } } int main(void){ solve(); //cout << "yui(*-v・)yui" << endl; return 0; }