#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; } |
English