Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <set>
- #include <queue>
- #include <map>
- #include <string>
- #include <fstream>
- #include <stack>
- using namespace std;
- typedef long long ll;
- #define forn(i, n) for (ll i = 0; i < n; i++)
- #define forna(i, a, n) for (ll i = a; i < n; i++)
- #define rforn(i, n) for (ll i = n - 1; i >= 0; i--)
- #define mp(a, b) make_pair(a, b)
- #define pb(a) push_back(a)
- struct ed {
- ll from, to, weight;
- ed(ll a, ll b, ll c) : from(a), to(b), weight(c) {};
- };
- int main() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- ll n, m;
- cin >> n >> m;
- ll _cost = 0;
- vector<vector<pair<ll, ll>>> edge(n);
- forn(i, m) {
- ll q, w, e;
- cin >> q >> w >> e;
- q--;
- w--;
- edge[q].pb(mp(w, e));
- edge[w].pb(mp(q, e));
- if (q == 0 || q == n - 1) {
- _cost = e;
- }
- }
- ll t;
- cin >> t;
- vector<vector<ll>> d(n, vector<ll>(2 * _cost, 2e18));
- vector<vector<bool>> was(n, vector<bool>(2 * _cost, false));
- set<pair<ll, pair<ll, ll>>> ver;
- forn(i, n) {
- forn(j, 2 * _cost) {
- ver.insert(mp(d[i][j], mp(i, j)));
- }
- }
- d[0][0] = 0;
- ll i = 0;
- ll j = 0;
- while (!ver.empty()) {
- was[i][j] = true;
- ver.erase(mp(d[i][j], mp(i, j)));
- // тут какой-то фор с релаксацией
- for (auto _next : edge[i]) {
- ll weight = _next.second;
- ll kuda = _next.first;
- ll ostatok = (j + weight) % (2 * _cost);
- if (d[kuda][ostatok] > d[i][j] + weight) {
- ver.erase(mp(d[kuda][ostatok], mp(kuda, ostatok)));
- ver.insert(mp(d[i][j] + weight, mp(kuda, ostatok)));
- d[kuda][ostatok] = d[i][j] + weight;
- }
- }
- i = ver.begin()->second.first;
- j = ver.begin()->second.second;
- }
- cout << (d[n - 1][t % (2 * _cost)] <= t ? "Possible" : "Impossible");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement