Submission #1193155

#TimeUsernameProblemLanguageResultExecution timeMemory
1193155vux2codeCommuter Pass (JOI18_commuter_pass)C++20
15 / 100
599 ms199820 KiB
// Src : Vux2Code
/* Note :

*/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ll, pll> lll;

#define fi first
#define se second   

#define pusb push_back
#define popb pop_back
#define pusf push_front
#define popf pop_front

#define vec3d vector<vector<vector<ll>>>
#define vec2d vector<vector<ll>>
#define vec1d vector<ll>
vec3d set3 (ll x, ll y, ll z, ll val = 0) {return vec3d (x, vec2d (y, vec1d (z, val)));}
vec2d set2 (ll x, ll y, ll val = 0) {return vec2d (x, vec1d (y, val));}

// debug (+20)
#define debug(...) debug_impl(#__VA_ARGS__, __VA_ARGS__)
template<typename... Args>
void debug_impl(const char* names, Args&&... args) {
    vector<string> _names;
    {
        istringstream ss(names);
        string token;
        while (getline(ss, token, ',')) {
            auto l = token.find_first_not_of(" 	");
            auto r = token.find_last_not_of(" 	");
            if (l == string::npos) _names.push_back("");
            else _names.push_back(token.substr(l, r - l + 1));
        }
    }
    cerr << "(";
    size_t _i = 0;
    int _dummy[] = { 0, ((cerr << _names[_i] << " : " << args << (++_i < _names.size() ? ", " : "")), 0)... };
    (void)_dummy;
    cerr << ")" << endl;
}

// handy for loops
#define forinc(i, a, b) for (ll i = (a); i <= (b); ++i)
#define fordec(i, a, b) for (ll i = (a); i >= (b); --i)
#define foreach(i, j) for (ll i : (j))

#define all(a) (a).begin (), (a). end ()
#define uni(a) (a).erase(unique((a).begin(), (a). end ()), (a). end ())

const ll maxN = 1e6 + 5, maxLog = 20, inf64 = 1e18, inf32 = 1e9, mod = 1e9 + 7;

void maxi(ll &x, ll y) { x = max(x, y); }
void mini(ll &x, ll y) { x = min(x, y); }

/* ---------HASHING-------- */
// const base = 31, mod2 = 1e9 + 9;

/* ---------BITMASK-------- */
// ll count(ll x) { return __builtin_popcountll(x); }
// ll fst(ll x) { return 63 - __builtin_clzll(x); }
// ll last(ll x) { return __builtin_ctzll(x); }
// bool bit(ll x, ll y) { return ((x >> y) & 1); }

ll t = 1;

ll n, m, d1 [maxN], d2 [maxN] [3];
pll s1, s2;
vector <pll> adj [maxN];
vec1d trace [maxN];
priority_queue <pll, vector <pll>, greater <pll>> q;
priority_queue <lll, vector <lll>, greater <lll>> q3;
queue <ll> fq;
set <ll> mp1 [maxN], mp2 [maxN];
bool vst [maxN];

bool fin (set <ll> &x, ll y) {
    return (x. find (y) == x. end ());
}

void up (ll x, ll y, ll v) {
    if (d2 [x] [y] > v) {
        d2 [x] [y] = v;
        q3. push ({d2 [x] [y], {x, y}});
    }
}

void solve() {
    cin >> n >> m >> s1. fi >> s1. se >> s2. fi >> s2. se;
    forinc (i, 1, m) {
        ll a, b, c; cin >> a >> b >> c;
        adj [a]. pusb ({b, c});
        adj [b]. pusb ({a, c});
    }
    memset (d1, 0x3f, sizeof d1);
    d1 [s1. fi] = 0;
    q. push ({d1 [s1. fi], s1. fi});
    while (!q. empty ()) {
        pll tmp = q. top ();
        q. pop ();
        if (tmp. fi != d1 [tmp. se]) continue;
        for (pll i : adj [tmp. se]) {
            if (d1 [i. fi] > d1 [tmp. se] + i. se) {
                d1 [i. fi] = d1 [tmp. se] + i. se;
                q. push ({d1 [i. fi], i. fi});
                trace [i. fi]. clear ();
            }
            if (d1 [i. fi] == d1 [tmp. se] + i. se) trace [i. fi]. pusb (tmp. se);
        }
    }
    fq. push (s1. se);
    vst [s1. se] = 1;
    while (!fq. empty ()) {
        ll tmp = fq. front ();
        fq. pop ();
        for (ll i : trace [tmp]) {
            if (vst [i]) continue;
            mp1 [i]. insert (tmp);
            mp2 [tmp]. insert (i);
            vst [i] = 1;
            fq. push (i);
        }
    } 
    ll ans = inf64;
    memset (d2, 0x3f, sizeof d2);
    d2 [s2. fi] [0] = 0;
    q3. push ({d2 [s2. fi] [0], {s2. fi, 0}});
    while (!q3. empty ()) {
        ll val = q3. top (). fi;
        ll id  = q3. top (). se. fi; 
        ll sta = q3. top (). se. se;
        q3. pop ();
        if (val != d2 [id] [sta]) continue;
        for (pll i : adj [id]) {
            switch (sta) {
            case 0 : up (i. fi, 0, d2 [id] [sta] + i. se); break; 
            case 1 : up (i. fi, 2, d2 [id] [sta] + i. se); break;
            case 2 : up (i. fi, 2, d2 [id] [sta] + i. se); break;
            } 
            if (!fin (mp1 [id], i. fi)) {
                switch (sta) {
                case 0 : up (i. fi, 1, d2 [id] [sta]); break;
                case 1 : up (i. fi, 1, d2 [id] [sta]); break;
                }
            }
        }
    }
    forinc (i, 0, 2) mini (ans, d2 [s2. se] [i]);
    memset (d2, 0x3f, sizeof d2);
    d2 [s2. fi] [0] = 0;
    q3. push ({d2 [s2. fi] [0], {s2. fi, 0}});
    while (!q3. empty ()) {
        ll val = q3. top (). fi;
        ll id  = q3. top (). se. fi; 
        ll sta = q3. top (). se. se;
        q3. pop ();
        if (val != d2 [id] [sta]) continue;
        for (pll i : adj [id]) {
            switch (sta) {
            case 0 : up (i. fi, 0, d2 [id] [sta] + i. se); break; 
            case 1 : up (i. fi, 2, d2 [id] [sta] + i. se); break;
            case 2 : up (i. fi, 2, d2 [id] [sta] + i. se); break;
            } 
            if (!fin (mp2 [id], i. fi)) {
                switch (sta) {
                case 0 : up (i. fi, 1, d2 [id] [sta]); break;
                case 1 : up (i. fi, 1, d2 [id] [sta]); break;
                }
            }
        }
    }
    forinc (i, 0, 2) mini (ans, d2 [s2. se] [i]);
    cout << ans;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    // #define TASK "E:/Code/CP/task"
    // if (fopen (TASK".inp", "r")) {
    //     freopen (TASK".inp", "r", stdin);
    //     freopen (TASK".out", "w", stdout);
    // }
    // cin >> t;
    while (t--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...