Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <set>
- #include <queue>
- using namespace std;
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- //просто считываем всё
- int k, n, m, u, v, p, q, r;
- cin >> k >> n >> m >> u >> v;
- vector < vector < pair<int, int> > > g(n + 1);
- for (int i = 0; i < m; ++i) {
- cin >> p >> q >> r;
- g[p].push_back({ q,r });
- g[q].push_back({ p,r });
- }
- int l, x;
- vector <bool> petrol(n + 1, false);
- cin >> l;
- for (int i = 0; i < l; i++) {
- cin >> x;
- petrol[x] = true;
- }
- //dp[i][j]-мин. кол-во заправок, чтоб доехать до города i с бензином j
- const long long INF = 1e18;
- vector <vector<long long>> dp(n + 1, vector<long long>(k + 1, INF));
- dp[u][k] = 0;
- queue <pair<int,int>> qu;
- qu.push({ u,k }); //очередь из пар город-текущий баланс бензина
- while (!qu.empty()) {
- pair<int,int> p = qu.front();
- u = p.first;
- int j = p.second;
- qu.pop();
- for (auto i = g[u].begin(); i != g[u].end(); i++) { //перебираем соседей
- int len = (*i).second;
- int versh = (*i).first;
- if (j - len >= 0) { //хватает бензина, чтоб доехать
- if (dp[u][j]<dp[versh][j-len]) { //если можем обновить dp, кидаем опять в очередь
- dp[versh][j - len] = dp[u][j];
- qu.push({ versh,j - len });
- }
- }
- if (petrol[u]) { //u-заправка
- if (k - len >= 0) { // хватает бензина
- if (dp[u][j] + 1 < dp[versh][k - len]) { //можем обновить dp
- dp[versh][k - len] = dp[u][j] + 1;
- qu.push({ versh,k - len });
- }
- }
- }
- }
- }
- //ответ - минимальное кол-во заправок в dp[v] с любым бензином
- auto ans = min_element(dp[v].begin(), dp[v].end());
- if (*ans == INF)
- cout << -1;
- else
- cout << *ans;
- }
Add Comment
Please, Sign In to add comment