#include <bits/stdc++.h> using namespace std; #pragma GCC optimize ("Ofast") #pragma GCC optimize ("unroll-loops") #pragma GCC target("sse,sse2,sse3,ssse3,sse4") typedef long long LL; // dajcie punkty za słabego bruta int n, m; LL bfs(vector<LL> &p, vector<set<LL>> &s, vector<vector<pair<LL, LL>>> &v){ s[1].insert(1); queue<pair<LL, LL>> q; q.push({1, 1}); LL sum = 0; for(int i=0; i<=n; i++) sum += p[i]; if(sum < 200009){ vector<vector<bool>> ss(n+1); for(int i=0; i<=n; i++){ ss[i].resize(p[i]+1); } ss[1][1]=true; while(!q.empty()){ auto [id, val] = q.front(); q.pop(); for(auto [b, c] : v[id]){ if(p[b] >= val*c && ss[b][val*c] == false){ ss[b][val*c] = true; q.push({b, val*c}); } } } LL r = -1; for(unsigned i=0; i<ss[n].size(); i++){ if(ss[n][i])r = i; } return r; }else{ while(!q.empty()){ auto [id, val] = q.front(); q.pop(); for(auto [b, c] : v[id]){ if(p[b] >= val*c && s[b].find(val*c) == s[b].end()){ s[b].insert(val*c); q.push({b, val*c}); } } } if(s[n].empty())return -1; return *s[n].rbegin(); } return -1; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int tt; cin>>tt; while(tt--) { cin>>n>>m; vector<LL> p(n+1); vector<set<LL>> s(n+1); vector<vector<pair<LL, LL>>> v(n+1); for(int i=1; i<=n; i++)cin>>p[i]; for(int i=0; i<m; i++){ LL a, b, c; cin>>a>>b>>c; v[a].push_back({b, c}); } cout<<bfs(p, s, v)<<"\n"; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include <bits/stdc++.h> using namespace std; #pragma GCC optimize ("Ofast") #pragma GCC optimize ("unroll-loops") #pragma GCC target("sse,sse2,sse3,ssse3,sse4") typedef long long LL; // dajcie punkty za słabego bruta int n, m; LL bfs(vector<LL> &p, vector<set<LL>> &s, vector<vector<pair<LL, LL>>> &v){ s[1].insert(1); queue<pair<LL, LL>> q; q.push({1, 1}); LL sum = 0; for(int i=0; i<=n; i++) sum += p[i]; if(sum < 200009){ vector<vector<bool>> ss(n+1); for(int i=0; i<=n; i++){ ss[i].resize(p[i]+1); } ss[1][1]=true; while(!q.empty()){ auto [id, val] = q.front(); q.pop(); for(auto [b, c] : v[id]){ if(p[b] >= val*c && ss[b][val*c] == false){ ss[b][val*c] = true; q.push({b, val*c}); } } } LL r = -1; for(unsigned i=0; i<ss[n].size(); i++){ if(ss[n][i])r = i; } return r; }else{ while(!q.empty()){ auto [id, val] = q.front(); q.pop(); for(auto [b, c] : v[id]){ if(p[b] >= val*c && s[b].find(val*c) == s[b].end()){ s[b].insert(val*c); q.push({b, val*c}); } } } if(s[n].empty())return -1; return *s[n].rbegin(); } return -1; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int tt; cin>>tt; while(tt--) { cin>>n>>m; vector<LL> p(n+1); vector<set<LL>> s(n+1); vector<vector<pair<LL, LL>>> v(n+1); for(int i=1; i<=n; i++)cin>>p[i]; for(int i=0; i<m; i++){ LL a, b, c; cin>>a>>b>>c; v[a].push_back({b, c}); } cout<<bfs(p, s, v)<<"\n"; } return 0; } |