#include #include #include #include using namespace std; using Long=long long; using Cost = tuple; void update_node(vector& costs, Cost c) { // cよりも大きいコストがあれば消してcをいれる // cよりも小さいコストがあれば入れない if(any_of(costs.begin(),costs.end(), [&](Cost a) { return (get<0>(a)<=get<0>(c)) && (get<1>(a)<=get<1>(c)); })) { // } else { costs.erase(remove_if(costs.begin(),costs.end(),[&](Cost a){ return (get<0>(a)>=get<0>(c)) && (get<1>(a)>=get<1>(c)); }), costs.end()); costs.push_back(c); } } int main() { int N,C,V; cin >> N >> C >> V; vector S(V),T(V),Y(V), M(V); for(int i=0;i> S[i]; for(int i=0;i> T[i]; for(int i=0;i> Y[i]; for(int i=0;i> M[i]; vector> node(N+1); node[1].push_back(Cost{0,0}); for(int i=1;i<=N;++i) { // node iからnode jへのコストを計算 for(int j=1;j<=N;++j) { // iからjへのパスを探す for(int k=0;k(node[i][l]) + Y[k]; int c2 = get<1>(node[i][l]) + M[k]; Cost c{c1,c2}; // cout << "node " << j+1 << "update (" << i+1 << "->" << j+1 << ")" << endl; update_node(node[j], c); } } } } } //for(int i=0;i(node[N][i])<=C && get<1>(node[N][i])(node[N][i]); } } cout << (minval==12e6 ? -1 : minval) << endl; }