#include <bits/stdc++.h>
using namespace std;
#define FOR(i, l, r) for(int i = (l); i <= (r); ++i)
#define REP(i, n) FOR(i, 0, (n) - 1)
#define ssize(x) int(x.size())
#ifdef DEBUG
auto &operator << (auto &o, pair<auto, auto> p) {
return o << "(" << p.first << ", " << p.second << ")";
}
auto operator << (auto &o, auto x) -> decltype(x.end(), o) {
o << "{"; int i = 0;
for (auto e : x) o << ","+!i++ << e;
return o << "}";
}
#define debug(X...) cerr << "["#X"]: ", [](auto ...$) {((cerr << $ << "; "), ...) << endl;}(X)
#else
#define debug(...) {}
#endif
struct Edge {
int to;
int weight;
};
vector<vector<Edge>> graph;
vector<int> p;
int n;
long long dfs(int node, long long total_weight) {
debug(node, total_weight);
if (total_weight > p[node])
return -1LL;
long long answer = -1LL;
if (node == n - 1)
answer = total_weight;
for (auto [to, weight] : graph[node]) {
long long ret = dfs(to, total_weight * weight);
answer = max(answer, ret);
}
return answer;
}
void solve() {
int m;
cin >> n >> m;
p = vector<int>(n);
REP (i, n)
cin >> p[i];
graph = vector<vector<Edge>>(n);
REP (i, m) {
int a, b, w;
cin >> a >> b >> w;
--a, --b;
graph[a].emplace_back(b, w);
}
cout << dfs(0, 1) << '\n';
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t; cin >> t;
while (t--)
solve();
}
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 | #include <bits/stdc++.h> using namespace std; #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) #define ssize(x) int(x.size()) #ifdef DEBUG auto &operator << (auto &o, pair<auto, auto> p) { return o << "(" << p.first << ", " << p.second << ")"; } auto operator << (auto &o, auto x) -> decltype(x.end(), o) { o << "{"; int i = 0; for (auto e : x) o << ","+!i++ << e; return o << "}"; } #define debug(X...) cerr << "["#X"]: ", [](auto ...$) {((cerr << $ << "; "), ...) << endl;}(X) #else #define debug(...) {} #endif struct Edge { int to; int weight; }; vector<vector<Edge>> graph; vector<int> p; int n; long long dfs(int node, long long total_weight) { debug(node, total_weight); if (total_weight > p[node]) return -1LL; long long answer = -1LL; if (node == n - 1) answer = total_weight; for (auto [to, weight] : graph[node]) { long long ret = dfs(to, total_weight * weight); answer = max(answer, ret); } return answer; } void solve() { int m; cin >> n >> m; p = vector<int>(n); REP (i, n) cin >> p[i]; graph = vector<vector<Edge>>(n); REP (i, m) { int a, b, w; cin >> a >> b >> w; --a, --b; graph[a].emplace_back(b, w); } cout << dfs(0, 1) << '\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while (t--) solve(); } |
English