#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
struct Edge {
int v;
LL w;
};
struct State {
int router;
LL power;
};
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
int T;
cin >> T;
while(T--)
{
int n, m;
cin >> n >> m;
vector<LL> cap(n + 1);
for (int i = 1; i <= n; i++)
cin >> cap[i];
vector<vector<Edge>> graph(n + 1);
for (int i = 0; i < m; i++)
{
int a, b;
LL w;
cin >> a >> b >> w;
graph[a].push_back({b, w});
}
vector<LL> max_allowed(n + 1, 0);
max_allowed[n] = cap[n];
bool changed = 1;
while (changed)
{
changed = 0;
for (int u = 1; u <= n; u++)
{
if (u == n)
continue;
LL best_val = 0;
for (auto &edge : graph[u])
{
int v = edge.v;
LL w = edge.w;
if(max_allowed[v] > 0)
{
LL candidate = max_allowed[v] / w + 1;
best_val = max(best_val, candidate);
}
}
LL new_val = min(cap[u], best_val);
if (new_val > max_allowed[u])
{
max_allowed[u] = new_val;
changed = 1;
}
}
}
vector<unordered_set<LL>> visited(n + 1);
queue<State> q;
LL ans = -1;
if (1 <= max_allowed[1])
{
q.push({1, 1});
visited[1].insert(1);
}
while (!q.empty())
{
State s = q.front();
q.pop();
int u = s.router;
LL p = s.power;
if (u == n)
ans = max(ans, p);
for (auto &edge : graph[u])
{
int v = edge.v;
LL newPower = p * edge.w;
if (newPower > cap[v])
continue;
if (newPower > max_allowed[v])
continue;
if (visited[v].find(newPower) == visited[v].end())
{
visited[v].insert(newPower);
q.push({v, newPower});
}
}
}
cout << ans << "\n";
}
}
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 | #include <bits/stdc++.h> using namespace std; typedef long long LL; struct Edge { int v; LL w; }; struct State { int router; LL power; }; int main() { ios::sync_with_stdio(0); cin.tie(0); int T; cin >> T; while(T--) { int n, m; cin >> n >> m; vector<LL> cap(n + 1); for (int i = 1; i <= n; i++) cin >> cap[i]; vector<vector<Edge>> graph(n + 1); for (int i = 0; i < m; i++) { int a, b; LL w; cin >> a >> b >> w; graph[a].push_back({b, w}); } vector<LL> max_allowed(n + 1, 0); max_allowed[n] = cap[n]; bool changed = 1; while (changed) { changed = 0; for (int u = 1; u <= n; u++) { if (u == n) continue; LL best_val = 0; for (auto &edge : graph[u]) { int v = edge.v; LL w = edge.w; if(max_allowed[v] > 0) { LL candidate = max_allowed[v] / w + 1; best_val = max(best_val, candidate); } } LL new_val = min(cap[u], best_val); if (new_val > max_allowed[u]) { max_allowed[u] = new_val; changed = 1; } } } vector<unordered_set<LL>> visited(n + 1); queue<State> q; LL ans = -1; if (1 <= max_allowed[1]) { q.push({1, 1}); visited[1].insert(1); } while (!q.empty()) { State s = q.front(); q.pop(); int u = s.router; LL p = s.power; if (u == n) ans = max(ans, p); for (auto &edge : graph[u]) { int v = edge.v; LL newPower = p * edge.w; if (newPower > cap[v]) continue; if (newPower > max_allowed[v]) continue; if (visited[v].find(newPower) == visited[v].end()) { visited[v].insert(newPower); q.push({v, newPower}); } } } cout << ans << "\n"; } } |
English