#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pi;
#define sz(x) (int)(x).size()
vector<ll> dijkstra(const vector<vector<pi>>& graph, int s) {
vector<ll> dist(sz(graph), 1e9);
set<pair<ll, int>> q;
q.insert({dist[s] = 1, s});
while (!q.empty()) {
auto [d, v] = *q.begin();
q.erase(q.begin());
if (d > dist[v])
continue;
for (auto [u, w] : graph[v]) {
if (dist[v] * w < dist[u]) {
dist[u] = dist[v] * w;
q.insert({dist[u], u});
}
}
}
return dist;
}
void heuristic(const vector<vector<pi>>& graph, vector<int>& p) {
vector<ll> dist = dijkstra(graph, sz(graph) - 1);
for (int i = 0; i < sz(p); i++)
p[i] = min(p[i], (int)(p.back() / dist[i]));
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin.exceptions(cin.failbit);
int T;
cin >> T;
while (T--) {
int n, m;
cin >> n >> m;
vector<int> p(n);
for (auto &x : p)
cin >> x;
vector<vector<pi>> graph(n);
vector<vector<pi>> rgraph(n);
while (m--) {
int u, v, w;
cin >> u >> v >> w;
u--, v--;
graph[u].push_back({v, w});
rgraph[v].push_back({u, w});
}
heuristic(rgraph, p);
set<pi> q;
vector<int> ampli(n, -1);
q.insert({1, 0});
while (!q.empty()) {
auto [d, v] = *(q.begin());
q.erase(q.begin());
if (d <= ampli[v])
continue;
ampli[v] = d;
for (auto [u, w] : graph[v]) {
if (p[u] >= (ll)d * w && d * w > ampli[u])
q.insert({d * w, u});
}
}
cout << ampli.back() << '\n';
}
}
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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<int, int> pi; #define sz(x) (int)(x).size() vector<ll> dijkstra(const vector<vector<pi>>& graph, int s) { vector<ll> dist(sz(graph), 1e9); set<pair<ll, int>> q; q.insert({dist[s] = 1, s}); while (!q.empty()) { auto [d, v] = *q.begin(); q.erase(q.begin()); if (d > dist[v]) continue; for (auto [u, w] : graph[v]) { if (dist[v] * w < dist[u]) { dist[u] = dist[v] * w; q.insert({dist[u], u}); } } } return dist; } void heuristic(const vector<vector<pi>>& graph, vector<int>& p) { vector<ll> dist = dijkstra(graph, sz(graph) - 1); for (int i = 0; i < sz(p); i++) p[i] = min(p[i], (int)(p.back() / dist[i])); } int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); int T; cin >> T; while (T--) { int n, m; cin >> n >> m; vector<int> p(n); for (auto &x : p) cin >> x; vector<vector<pi>> graph(n); vector<vector<pi>> rgraph(n); while (m--) { int u, v, w; cin >> u >> v >> w; u--, v--; graph[u].push_back({v, w}); rgraph[v].push_back({u, w}); } heuristic(rgraph, p); set<pi> q; vector<int> ampli(n, -1); q.insert({1, 0}); while (!q.empty()) { auto [d, v] = *(q.begin()); q.erase(q.begin()); if (d <= ampli[v]) continue; ampli[v] = d; for (auto [u, w] : graph[v]) { if (p[u] >= (ll)d * w && d * w > ampli[u]) q.insert({d * w, u}); } } cout << ampli.back() << '\n'; } } |
English