Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <string>
- #include <fstream>
- #include <sstream>
- #include <iomanip>
- #include <set>
- #include <map>
- #include <queue>
- //#define int long long
- #define vi vector<int>
- #define vec vector
- using namespace std;
- double get() {
- return ((double)rand()) / RAND_MAX;
- }
- const int MOD = 1000000007;
- int fact[1000010], inv[1000010];
- int C(int k, int n) {
- return fact[n] * inv[k] % MOD * inv[n - k] % MOD;
- }
- int binpow(int a, int b) {
- if (!b) return 1;
- int x = binpow(a, b >> 1);
- if (b & 1) return (((x * x) % MOD) * a) % MOD;
- return((x * x) % MOD);
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int n, m, s, k;
- cin >> n >> m >> s >> k;
- s--;
- vi x(k);
- for (auto& e : x) cin >> e, --e;
- vi dm(n);
- for (auto& e : dm) cin >> e;
- vec<vec<pair<int, int>>> g(n);
- vec<vi> dp(n, vi(1051, 2e9));
- while (m--) {
- int f, t, s;
- cin >> f >> t >> s;
- --f; --t;
- g[f].push_back({ t, s });
- g[t].push_back({ f, s });
- }
- queue<pair<pair<int, int>, int>> q;
- q.push({ { s, dm[s] }, 0 });
- while (q.size()) {
- auto cur = q.front();
- q.pop();
- for (auto& e : g[cur.first.first]) {
- if (e.second <= cur.first.second) {
- int nd = max(cur.first.second - e.second, dm[e.first]);
- if (dp[e.first][nd] > cur.second + e.second) {
- dp[e.first][nd] = cur.second + e.second;
- q.push({ {e.first, nd}, cur.second + e.second });
- }
- }
- }
- }
- int ans = 2e9;
- for (auto& e : x) {
- for (int i = 0; i < 1051; ++i)
- ans = min(ans, dp[e][i]);
- }
- if (ans != 1e9)
- cout << ans;
- else cout << 0;
- }
- // N
- // Q L R X
- // N
- //
Advertisement
Add Comment
Please, Sign In to add comment