#include <iostream>
#include <set>
#include <queue>
#include <vector>
using namespace std;
using LL = long long;
using PII = pair<int, int>;
constexpr int MAX = 1000000000;
int solve(const vector<int>& router, const vector<vector<PII>>& amplif, int n)
{
vector<set<int>> visited(n);
queue<PII> q;
q.push({ 0, 1 });
while (!q.empty())
{
PII cur = q.front();
q.pop();
for (size_t i = 0; i < amplif[cur.first].size(); ++i)
{
LL val = 1LL * cur.second * amplif[cur.first][i].second;
if (val > MAX)
continue;
PII nxt = { amplif[cur.first][i].first, (int)val };
if (nxt.second <= router[nxt.first])
{
if (visited[nxt.first].find(nxt.second) == visited[nxt.first].end())
{
visited[nxt.first].insert(nxt.second);
q.push(nxt);
}
}
}
}
int res = -1;
if (!visited[n - 1].empty())
res = *visited[n - 1].rbegin();
return res;
}
int main()
{
int t, n, m, a, b, w;
cin >> t;
for (int tt = 0; tt < t; ++tt)
{
cin >> n >> m;
vector<int> router(n);
vector<vector<PII>> amplif(n);
for (int i = 0; i < n; ++i)
{
cin >> router[i];
}
for (int i = 0; i < m; ++i)
{
cin >> a >> b >> w;
amplif[a - 1].push_back({ b - 1, w });
}
int res = solve(router, amplif, n);
cout << res << 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 | #include <iostream> #include <set> #include <queue> #include <vector> using namespace std; using LL = long long; using PII = pair<int, int>; constexpr int MAX = 1000000000; int solve(const vector<int>& router, const vector<vector<PII>>& amplif, int n) { vector<set<int>> visited(n); queue<PII> q; q.push({ 0, 1 }); while (!q.empty()) { PII cur = q.front(); q.pop(); for (size_t i = 0; i < amplif[cur.first].size(); ++i) { LL val = 1LL * cur.second * amplif[cur.first][i].second; if (val > MAX) continue; PII nxt = { amplif[cur.first][i].first, (int)val }; if (nxt.second <= router[nxt.first]) { if (visited[nxt.first].find(nxt.second) == visited[nxt.first].end()) { visited[nxt.first].insert(nxt.second); q.push(nxt); } } } } int res = -1; if (!visited[n - 1].empty()) res = *visited[n - 1].rbegin(); return res; } int main() { int t, n, m, a, b, w; cin >> t; for (int tt = 0; tt < t; ++tt) { cin >> n >> m; vector<int> router(n); vector<vector<PII>> amplif(n); for (int i = 0; i < n; ++i) { cin >> router[i]; } for (int i = 0; i < m; ++i) { cin >> a >> b >> w; amplif[a - 1].push_back({ b - 1, w }); } int res = solve(router, amplif, n); cout << res << endl; } return 0; } |
English