#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Amplifier {
int from, to;
long long gain;
};
void solve() {
int n, m;
cin >> n >> m;
vector<long long> capacity(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> capacity[i];
}
vector<Amplifier> amplifiers(m);
for (int i = 0; i < m; ++i) {
cin >> amplifiers[i].from >> amplifiers[i].to >> amplifiers[i].gain;
}
vector<long long> max_signal(n + 1, 0);
max_signal[1] = 1; // Sygnał startowy
// Algorytm Bellmana-Forda dla mnożenia wzmocnień
for (int i = 0; i < n - 1; ++i) {
bool changed = false;
for (const auto & : amplifiers) {
int a = amp.from, b = amp.to;
long long w = amp.gain;
if (max_signal[a] > 0 && max_signal[a] * w <= capacity[b] && max_signal[a] * w > max_signal[b]) {
max_signal[b] = max_signal[a] * w;
changed = true;
}
}
if (!changed) break; // Jeśli nic się nie zmieniło, możemy przerwać
}
// Wynik dla rutera n
cout << (max_signal[n] > 0 ? max_signal[n] : -1) << endl;
}
int main() {
int T;
cin >> T;
while (T--) {
solve();
}
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 | #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Amplifier { int from, to; long long gain; }; void solve() { int n, m; cin >> n >> m; vector<long long> capacity(n + 1); for (int i = 1; i <= n; ++i) { cin >> capacity[i]; } vector<Amplifier> amplifiers(m); for (int i = 0; i < m; ++i) { cin >> amplifiers[i].from >> amplifiers[i].to >> amplifiers[i].gain; } vector<long long> max_signal(n + 1, 0); max_signal[1] = 1; // Sygnał startowy // Algorytm Bellmana-Forda dla mnożenia wzmocnień for (int i = 0; i < n - 1; ++i) { bool changed = false; for (const auto & : amplifiers) { int a = amp.from, b = amp.to; long long w = amp.gain; if (max_signal[a] > 0 && max_signal[a] * w <= capacity[b] && max_signal[a] * w > max_signal[b]) { max_signal[b] = max_signal[a] * w; changed = true; } } if (!changed) break; // Jeśli nic się nie zmieniło, możemy przerwać } // Wynik dla rutera n cout << (max_signal[n] > 0 ? max_signal[n] : -1) << endl; } int main() { int T; cin >> T; while (T--) { solve(); } return 0; } |
English