#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; } |