#ifndef LOCAL
#pragma GCC optimize("O3")
#endif
#include <bits/stdc++.h>
#define FOR(i,p,k) for(int i=(p);i<=(k);++i)
#define REP(i,n) FOR(i,0,(n)-1)
#define RFOR(i,p,n) for(int i=(p);i>=(n);--i)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define ssize(x) int((x).size())
#define fi first
#define se second
#define V vector
#define pb push_back
#define eb emplace_back
#define C const
#define pn printf("\n")
using namespace std;
typedef long long ll;
typedef V<int> vi;
typedef V<ll> vll;
typedef const int ci;
typedef const ll cll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
void chmin(auto &a, auto b){a=min(a,b);}
void chmax(auto &a, auto b){a=max(a,b);}
ci inf = 2.1e9;
cll infll = 4.5e18;
int I(){
int z;
scanf("%d", &z);
//cin >> z;
return z;
}
void answer(){
int n = I(), m = I();
vi limit(n+1);
FOR(i, 1, n) limit[i] = I();
V<V<pii>> przod(n+1), tyl(n+1);
REP(i, m){
int a = I(), b = I(), c = I();
przod[a].eb(b, c);
tyl[b].eb(a, c);
}
int pier = 1;
while((pier+1)*(pier+1) <= limit[n]) ++pier;
queue<pair<int, pii>> q;
V dp_przod(n+1, vi(pier+1, 0));
dp_przod[1][1] = 1;
q.emplace(1, make_pair(1, 1));
while(ssize(q)){
auto [odl, stan] = q.front();
q.pop();
auto [w, ilo] = stan;
if(dp_przod[w][ilo] > odl) continue;
for(auto [dokad, mnoz] : przod[w]) if(mnoz <= pier/ilo && ilo*mnoz <= limit[dokad]){
int tmp = ilo*mnoz;
if(tmp <= limit[dokad] && tmp > dp_przod[dokad][tmp]){
dp_przod[dokad][tmp] = tmp;
q.emplace(tmp, make_pair(dokad, tmp));
}
}
}
priority_queue<pair<int, pii>> pq;
V dp_tyl(n+1, vi(pier+1, 0));
dp_tyl[n][1] = limit[n];
pq.emplace(limit[n], make_pair(n, 1));
while(ssize(pq)){
auto [odl, stan] = pq.top();
pq.pop();
auto [w, ilo] = stan;
if(dp_tyl[w][ilo] > odl) continue;
for(auto [dokad, mnoz] : tyl[w]) if(mnoz <= pier/ilo){
int tmp = ilo*mnoz;
int moc = min(odl/mnoz, limit[dokad]);
if(moc > dp_tyl[dokad][tmp]){
dp_tyl[dokad][tmp] = moc;
pq.emplace(moc, make_pair(dokad, tmp));
}
}
}
FOR(i, 1, n) FOR(j, 1, pier) chmax(dp_przod[i][j], dp_przod[i][j-1]);
int wyn = 0;
if(1 == n) wyn = 1;
FOR(a, 1, n) for(auto [b, waga] : przod[a]){
FOR(ilo_suff, 1, pier){
int maks_moc = min(dp_tyl[b][ilo_suff]/waga, limit[a]);
chmin(maks_moc, pier);
int ilo_pref = dp_przod[a][maks_moc];
chmax(wyn, ilo_pref * waga * ilo_suff);
}
}
printf("%d\n", wyn>0 ? wyn : -1);
}
int main(){
//ios_base::sync_with_stdio(0);
//cin.tie(0);
int tt = 1;
tt = I();
while(tt--) answer();
}
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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #ifndef LOCAL #pragma GCC optimize("O3") #endif #include <bits/stdc++.h> #define FOR(i,p,k) for(int i=(p);i<=(k);++i) #define REP(i,n) FOR(i,0,(n)-1) #define RFOR(i,p,n) for(int i=(p);i>=(n);--i) #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() #define ssize(x) int((x).size()) #define fi first #define se second #define V vector #define pb push_back #define eb emplace_back #define C const #define pn printf("\n") using namespace std; typedef long long ll; typedef V<int> vi; typedef V<ll> vll; typedef const int ci; typedef const ll cll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; void chmin(auto &a, auto b){a=min(a,b);} void chmax(auto &a, auto b){a=max(a,b);} ci inf = 2.1e9; cll infll = 4.5e18; int I(){ int z; scanf("%d", &z); //cin >> z; return z; } void answer(){ int n = I(), m = I(); vi limit(n+1); FOR(i, 1, n) limit[i] = I(); V<V<pii>> przod(n+1), tyl(n+1); REP(i, m){ int a = I(), b = I(), c = I(); przod[a].eb(b, c); tyl[b].eb(a, c); } int pier = 1; while((pier+1)*(pier+1) <= limit[n]) ++pier; queue<pair<int, pii>> q; V dp_przod(n+1, vi(pier+1, 0)); dp_przod[1][1] = 1; q.emplace(1, make_pair(1, 1)); while(ssize(q)){ auto [odl, stan] = q.front(); q.pop(); auto [w, ilo] = stan; if(dp_przod[w][ilo] > odl) continue; for(auto [dokad, mnoz] : przod[w]) if(mnoz <= pier/ilo && ilo*mnoz <= limit[dokad]){ int tmp = ilo*mnoz; if(tmp <= limit[dokad] && tmp > dp_przod[dokad][tmp]){ dp_przod[dokad][tmp] = tmp; q.emplace(tmp, make_pair(dokad, tmp)); } } } priority_queue<pair<int, pii>> pq; V dp_tyl(n+1, vi(pier+1, 0)); dp_tyl[n][1] = limit[n]; pq.emplace(limit[n], make_pair(n, 1)); while(ssize(pq)){ auto [odl, stan] = pq.top(); pq.pop(); auto [w, ilo] = stan; if(dp_tyl[w][ilo] > odl) continue; for(auto [dokad, mnoz] : tyl[w]) if(mnoz <= pier/ilo){ int tmp = ilo*mnoz; int moc = min(odl/mnoz, limit[dokad]); if(moc > dp_tyl[dokad][tmp]){ dp_tyl[dokad][tmp] = moc; pq.emplace(moc, make_pair(dokad, tmp)); } } } FOR(i, 1, n) FOR(j, 1, pier) chmax(dp_przod[i][j], dp_przod[i][j-1]); int wyn = 0; if(1 == n) wyn = 1; FOR(a, 1, n) for(auto [b, waga] : przod[a]){ FOR(ilo_suff, 1, pier){ int maks_moc = min(dp_tyl[b][ilo_suff]/waga, limit[a]); chmin(maks_moc, pier); int ilo_pref = dp_przod[a][maks_moc]; chmax(wyn, ilo_pref * waga * ilo_suff); } } printf("%d\n", wyn>0 ? wyn : -1); } int main(){ //ios_base::sync_with_stdio(0); //cin.tie(0); int tt = 1; tt = I(); while(tt--) answer(); } |
English