#include <bits/stdc++.h>
using namespace std;
struct Node {
int id;
vector<long long> enhancemnts;
vector<pair<int, long long>> neighbors;
long long max_enhancement;
set<long long> visited_enhancements;
};
vector<Node> nodes;
long long find_solution() {
queue<pair<int, long long>> q;
q.push({0, 1});
while (!q.empty()) {
auto [node_id, enhancement] = q.front();
q.pop();
auto& node = nodes[node_id];
if (node.visited_enhancements.find(enhancement) != node.visited_enhancements.end()) {
continue;
}
if (enhancement > node.max_enhancement) {
continue;
}
node.visited_enhancements.insert(enhancement);
for (auto [neighbor_id, weight] : node.neighbors) {
auto& neighbor = nodes[neighbor_id];
long long new_enhancement = enhancement * weight;
q.push({neighbor_id, new_enhancement});
}
}
if (nodes[nodes.size() - 1].visited_enhancements.empty()) {
return -1;
}
return *max_element(nodes[nodes.size() - 1].visited_enhancements.begin(), nodes[nodes.size() - 1].visited_enhancements.end());
}
long long run() {
int n, m;
cin >> n >> m;
nodes.clear();
for (int i = 0; i < n; i++) {
Node node;
node.id = i;
long long max_enhancement;
cin >> max_enhancement;
node.max_enhancement = max_enhancement;
nodes.push_back(node);
}
for (int i = 0; i < m; i++) {
int u, v;
long long w;
cin >> u >> v >> w;
nodes[u-1].neighbors.push_back({v-1, w});
}
cout << find_solution() << endl;
return 0;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
for (int i = 0; i < t; i++) {
run();
}
return 0;
}
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 | #include <bits/stdc++.h> using namespace std; struct Node { int id; vector<long long> enhancemnts; vector<pair<int, long long>> neighbors; long long max_enhancement; set<long long> visited_enhancements; }; vector<Node> nodes; long long find_solution() { queue<pair<int, long long>> q; q.push({0, 1}); while (!q.empty()) { auto [node_id, enhancement] = q.front(); q.pop(); auto& node = nodes[node_id]; if (node.visited_enhancements.find(enhancement) != node.visited_enhancements.end()) { continue; } if (enhancement > node.max_enhancement) { continue; } node.visited_enhancements.insert(enhancement); for (auto [neighbor_id, weight] : node.neighbors) { auto& neighbor = nodes[neighbor_id]; long long new_enhancement = enhancement * weight; q.push({neighbor_id, new_enhancement}); } } if (nodes[nodes.size() - 1].visited_enhancements.empty()) { return -1; } return *max_element(nodes[nodes.size() - 1].visited_enhancements.begin(), nodes[nodes.size() - 1].visited_enhancements.end()); } long long run() { int n, m; cin >> n >> m; nodes.clear(); for (int i = 0; i < n; i++) { Node node; node.id = i; long long max_enhancement; cin >> max_enhancement; node.max_enhancement = max_enhancement; nodes.push_back(node); } for (int i = 0; i < m; i++) { int u, v; long long w; cin >> u >> v >> w; nodes[u-1].neighbors.push_back({v-1, w}); } cout << find_solution() << endl; return 0; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t; cin >> t; for (int i = 0; i < t; i++) { run(); } return 0; } |
English