#include<bits/stdc++.h> #define LL long long #define LLL __int128 #define uint unsigned #define ldb long double #define uLL unsigned long long using namespace std; const int N=105,M=4e4+5,B=4e4; int n,m; int a[N]; int f[N][M],g[N][M]; vector<pair<int,int>>G[N],R[N]; inline void MAIN(){ cin>>n>>m; for(int i=1;i<=n;++i){ cin>>a[i],G[i].clear(),R[i].clear(); fill(f[i]+1,f[i]+B+1,0),fill(g[i]+1,g[i]+B+1,0); } for(int i=1;i<=m;++i){ int u,v,w;cin>>u>>v>>w; G[u].emplace_back(v,w); R[v].emplace_back(u,w); } { f[1][1]=1; for(int x=1;x<=B;++x){ queue<int>Q; for(int u=1;u<=n;++u)if(f[u][x])Q.emplace(u); while(!Q.empty()){ int u=Q.front();Q.pop(); for(auto [v,w]:G[u])if(min(B,a[v])>=1ll*x*w&&!f[v][x*w]){ f[v][x*w]=1; if(w==1)Q.emplace(v); } } } } { g[n][1]=a[n]; for(int y=1;y<=B;++y){ priority_queue<pair<int,int>>Q; for(int u=1;u<=n;++u)Q.emplace(g[u][y],u); while(!Q.empty()){ auto [_,u]=Q.top();Q.pop(); if(_!=g[u][y])continue; for(auto [v,w]:R[u])if(B>=1ll*y*w){ int s=min(a[v],g[u][y]/w); if(s>g[v][y*w]){ g[v][y*w]=s; if(w==1)Q.emplace(g[v][y],v); } } } } for(int y=B;y>=1;--y) for(int u=1;u<=n;++u) g[u][y]=min(a[u],max(g[u][y+1],g[u][y])); } int ans=-1; for(int x=1;x<=B;++x) for(int u=1;u<=n;++u)if(f[u][x]) for(auto [v,w]:G[u])if(a[v]>=1ll*x*w){ int y=upper_bound(g[v]+1,g[v]+B+1,x*w,greater<>())-g[v]-1; ans=max(ans,x*y*w); } cout<<ans<<'\n'; } signed main(){ cin.tie(0)->sync_with_stdio(0); int t=1;cin>>t;while(t--)MAIN(); return 0; } /* 1 2 3 250 1000 1 1 2 1 2 3 2 1 37 */
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 | #include<bits/stdc++.h> #define LL long long #define LLL __int128 #define uint unsigned #define ldb long double #define uLL unsigned long long using namespace std; const int N=105,M=4e4+5,B=4e4; int n,m; int a[N]; int f[N][M],g[N][M]; vector<pair<int,int>>G[N],R[N]; inline void MAIN(){ cin>>n>>m; for(int i=1;i<=n;++i){ cin>>a[i],G[i].clear(),R[i].clear(); fill(f[i]+1,f[i]+B+1,0),fill(g[i]+1,g[i]+B+1,0); } for(int i=1;i<=m;++i){ int u,v,w;cin>>u>>v>>w; G[u].emplace_back(v,w); R[v].emplace_back(u,w); } { f[1][1]=1; for(int x=1;x<=B;++x){ queue<int>Q; for(int u=1;u<=n;++u)if(f[u][x])Q.emplace(u); while(!Q.empty()){ int u=Q.front();Q.pop(); for(auto [v,w]:G[u])if(min(B,a[v])>=1ll*x*w&&!f[v][x*w]){ f[v][x*w]=1; if(w==1)Q.emplace(v); } } } } { g[n][1]=a[n]; for(int y=1;y<=B;++y){ priority_queue<pair<int,int>>Q; for(int u=1;u<=n;++u)Q.emplace(g[u][y],u); while(!Q.empty()){ auto [_,u]=Q.top();Q.pop(); if(_!=g[u][y])continue; for(auto [v,w]:R[u])if(B>=1ll*y*w){ int s=min(a[v],g[u][y]/w); if(s>g[v][y*w]){ g[v][y*w]=s; if(w==1)Q.emplace(g[v][y],v); } } } } for(int y=B;y>=1;--y) for(int u=1;u<=n;++u) g[u][y]=min(a[u],max(g[u][y+1],g[u][y])); } int ans=-1; for(int x=1;x<=B;++x) for(int u=1;u<=n;++u)if(f[u][x]) for(auto [v,w]:G[u])if(a[v]>=1ll*x*w){ int y=upper_bound(g[v]+1,g[v]+B+1,x*w,greater<>())-g[v]-1; ans=max(ans,x*y*w); } cout<<ans<<'\n'; } signed main(){ cin.tie(0)->sync_with_stdio(0); int t=1;cin>>t;while(t--)MAIN(); return 0; } /* 1 2 3 250 1000 1 1 2 1 2 3 2 1 37 */ |