#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll cap[102];
basic_string <pair<int,ll>> con[102];
unordered_set <ll> dp[102];
priority_queue <pair<ll,int>> pq;
unordered_map <int,bool> vis[102][102];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t; cin >> t;
while(t--)
{
int n,m; cin >> n >> m;
for(int i=1; i<=n; i++) cin >> cap[i];
for(int i=1; i<=m; i++)
{
int a,b; ll w; cin >> a >> b >> w;
if(a == b && w == 1 || vis[a][b][w]) continue;
con[a].push_back({b,w}); vis[a][b][w]=1;
}
dp[1].insert(1); pq.push({1,1});
while(!pq.empty())
{
auto tp = pq.top(); pq.pop();
int v = tp.second; ll prev = tp.first;
if(dp[v].find(prev) == dp[v].end()) continue;
for(auto &e : con[v])
{
int u = e.first; ll act = prev*e.second;
if(act > cap[u]) continue;
if(dp[u].find(act) != dp[u].end()) continue;
dp[u].insert(act); pq.push({act,u});
}
}
if(!(int)dp[n].size()) cout << -1 << "\n";
else
{
ll ret = 0;
for(auto x : dp[n]) ret = max(ret,x);
cout << ret << "\n";
}
for(int i=1; i<=n; i++) con[i].clear(), dp[i].clear();
for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) vis[i][j].clear();
}
}
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 | #include <bits/stdc++.h> using namespace std; #define ll long long ll cap[102]; basic_string <pair<int,ll>> con[102]; unordered_set <ll> dp[102]; priority_queue <pair<ll,int>> pq; unordered_map <int,bool> vis[102][102]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; while(t--) { int n,m; cin >> n >> m; for(int i=1; i<=n; i++) cin >> cap[i]; for(int i=1; i<=m; i++) { int a,b; ll w; cin >> a >> b >> w; if(a == b && w == 1 || vis[a][b][w]) continue; con[a].push_back({b,w}); vis[a][b][w]=1; } dp[1].insert(1); pq.push({1,1}); while(!pq.empty()) { auto tp = pq.top(); pq.pop(); int v = tp.second; ll prev = tp.first; if(dp[v].find(prev) == dp[v].end()) continue; for(auto &e : con[v]) { int u = e.first; ll act = prev*e.second; if(act > cap[u]) continue; if(dp[u].find(act) != dp[u].end()) continue; dp[u].insert(act); pq.push({act,u}); } } if(!(int)dp[n].size()) cout << -1 << "\n"; else { ll ret = 0; for(auto x : dp[n]) ret = max(ret,x); cout << ret << "\n"; } for(int i=1; i<=n; i++) con[i].clear(), dp[i].clear(); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) vis[i][j].clear(); } } |
English