#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<pii, int> pp;
const int N = 101;
set<pii> G[N];
int n, m, p[N];
bool check(ll m) {
priority_queue<pp> pq;
unordered_map<int, int> maxl[N];
pq.push({{p[n], m}, n});
maxl[n][m] = p[n];
while (!pq.empty()) {
pair<pii, int> x = pq.top(); pq.pop();
int v = x.second;
pii intv = {x.first.second, x.first.first};
if (v == 1 && intv.first <= 1 && 1 <= intv.second) return true;
for (auto u : G[v]) {
pii nintv = {(intv.first + u.first-1)/u.first, min(intv.second / u.first, p[u.second])};
if (nintv.first > nintv.second) continue;
if (nintv.second < 1) continue;
if (maxl[u.second][nintv.first] >= nintv.second) continue;
maxl[u.second][nintv.first] = nintv.second;
pq.push({{nintv.second, nintv.first}, u.second});
if (u.second == 1 && nintv.first <= 1 && 1 <= nintv.second) return true;
}
} return false;
}
void solve() {
cin>>n>>m;
for (int i=1; i<=n; ++i) cin>>p[i];
for (int i=1; i<=m; ++i) {
int a, b, w; cin>>a>>b>>w;
G[b].insert({w, a});
}
int l=1, r=p[n], ans=-1;
while (l <= r) {
ll m=(l+r)/2;
if (check(m)) {
ans = m;
l = m+1;
} else {
r = m-1;
}
} cout<<ans<<"\n";
for (int i=0; i<=n; ++i) G[i].clear();
}
int main() {
ios_base::sync_with_stdio(NULL);
cin.tie(NULL);
cout.tie(NULL);
int t=1; cin>>t;
while (t--) solve();
}
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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<pii, int> pp; const int N = 101; set<pii> G[N]; int n, m, p[N]; bool check(ll m) { priority_queue<pp> pq; unordered_map<int, int> maxl[N]; pq.push({{p[n], m}, n}); maxl[n][m] = p[n]; while (!pq.empty()) { pair<pii, int> x = pq.top(); pq.pop(); int v = x.second; pii intv = {x.first.second, x.first.first}; if (v == 1 && intv.first <= 1 && 1 <= intv.second) return true; for (auto u : G[v]) { pii nintv = {(intv.first + u.first-1)/u.first, min(intv.second / u.first, p[u.second])}; if (nintv.first > nintv.second) continue; if (nintv.second < 1) continue; if (maxl[u.second][nintv.first] >= nintv.second) continue; maxl[u.second][nintv.first] = nintv.second; pq.push({{nintv.second, nintv.first}, u.second}); if (u.second == 1 && nintv.first <= 1 && 1 <= nintv.second) return true; } } return false; } void solve() { cin>>n>>m; for (int i=1; i<=n; ++i) cin>>p[i]; for (int i=1; i<=m; ++i) { int a, b, w; cin>>a>>b>>w; G[b].insert({w, a}); } int l=1, r=p[n], ans=-1; while (l <= r) { ll m=(l+r)/2; if (check(m)) { ans = m; l = m+1; } else { r = m-1; } } cout<<ans<<"\n"; for (int i=0; i<=n; ++i) G[i].clear(); } int main() { ios_base::sync_with_stdio(NULL); cin.tie(NULL); cout.tie(NULL); int t=1; cin>>t; while (t--) solve(); } |
English