#include<iostream>
#include<vector>
#include<set>
#include<unordered_set>
#include<algorithm>
#include<bitset>
using namespace std;
long long M = 1;
struct route {
long long router;
long long power;
};
bool operator<(const route &a, const route &b) {
if (a.power < b.power) return true;
if (a.power > b.power) return false;
if (a.router < b.router) return true;
return false;
}
inline long long get_key(long long router, long long power) {
return (power << M) + router;
}
const long long H = 4'000'000'000;
bitset<H> visited_small;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while (t--) {
int n, m;
cin >> n >> m;
M = 1;
while (1 << M <= n) {
M++;
}
vector<long long> max_powers(n);
for (int i = 0; i < n; i++) {
cin >> max_powers[i];
}
for (int i = 0; i < n; i++) {
max_powers[i] = min(max_powers[i], max_powers[n - 1]);
}
vector<set<route>> routes_set(n);
for (int i = 0; i < m; i++) {
long long u, v, w;
cin >> u >> v >> w;
u--;
v--;
if (u == v && w == 1) continue;
if (w > max_powers[v]) continue;
routes_set[u].insert({v, w});
}
vector<vector<route>> routes(n);
for (int i = 0; i < n; i++) {
for (route r: routes_set[i]) {
routes[i].push_back(r);
}
}
long long result = -1;
if (n == 1) {
result = 1;
}
// long long small_hits = 0;
// long long large_hits = 0;
vector<route> lst;
lst.reserve(20'000'000);
lst.push_back({0, 1});
visited_small.reset();
visited_small.set(get_key(0, 1));
unordered_set<long long> visited_large;
visited_large.reserve(20'000);
for (int i = 0; i < lst.size(); i++) {
route u = lst[i];
for (route v : routes[u.router]) {
long long power = u.power * v.power;
if (power > max_powers[v.router]) continue;
long long key = get_key(v.router, power);
if (key < H) {
// small_hits++;
if (visited_small.test(key)) continue;
visited_small.set(key);
}
else {
// large_hits++;
if (visited_large.count(key)) continue;
visited_large.insert(key);
}
lst.push_back({v.router, power});
if (v.router == n - 1) {
result = max(result, power);
}
}
}
// cerr << "small hits: " << small_hits << endl;
// cerr << "large hits: " << large_hits << endl;
// cerr << "elements processed: " << lst.size() << endl;
cout << result << endl;
}
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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include<iostream> #include<vector> #include<set> #include<unordered_set> #include<algorithm> #include<bitset> using namespace std; long long M = 1; struct route { long long router; long long power; }; bool operator<(const route &a, const route &b) { if (a.power < b.power) return true; if (a.power > b.power) return false; if (a.router < b.router) return true; return false; } inline long long get_key(long long router, long long power) { return (power << M) + router; } const long long H = 4'000'000'000; bitset<H> visited_small; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while (t--) { int n, m; cin >> n >> m; M = 1; while (1 << M <= n) { M++; } vector<long long> max_powers(n); for (int i = 0; i < n; i++) { cin >> max_powers[i]; } for (int i = 0; i < n; i++) { max_powers[i] = min(max_powers[i], max_powers[n - 1]); } vector<set<route>> routes_set(n); for (int i = 0; i < m; i++) { long long u, v, w; cin >> u >> v >> w; u--; v--; if (u == v && w == 1) continue; if (w > max_powers[v]) continue; routes_set[u].insert({v, w}); } vector<vector<route>> routes(n); for (int i = 0; i < n; i++) { for (route r: routes_set[i]) { routes[i].push_back(r); } } long long result = -1; if (n == 1) { result = 1; } // long long small_hits = 0; // long long large_hits = 0; vector<route> lst; lst.reserve(20'000'000); lst.push_back({0, 1}); visited_small.reset(); visited_small.set(get_key(0, 1)); unordered_set<long long> visited_large; visited_large.reserve(20'000); for (int i = 0; i < lst.size(); i++) { route u = lst[i]; for (route v : routes[u.router]) { long long power = u.power * v.power; if (power > max_powers[v.router]) continue; long long key = get_key(v.router, power); if (key < H) { // small_hits++; if (visited_small.test(key)) continue; visited_small.set(key); } else { // large_hits++; if (visited_large.count(key)) continue; visited_large.insert(key); } lst.push_back({v.router, power}); if (v.router == n - 1) { result = max(result, power); } } } // cerr << "small hits: " << small_hits << endl; // cerr << "large hits: " << large_hits << endl; // cerr << "elements processed: " << lst.size() << endl; cout << result << endl; } return 0; } |
English