제출 #330627

#제출 시각아이디문제언어결과실행 시간메모리
330627plourde27Commuter Pass (JOI18_commuter_pass)C++17
0 / 100
416 ms262148 KiB
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <set>
#include <algorithm>
#include <map>
#include <fstream>
#include <bitset>
#include <unordered_map>
#include <stack>
#include <list>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef map<int, int> mii;
typedef map<int, string> mis;
typedef map<string, int> msi;
typedef set<int> si;
typedef set<ll> sl;
typedef map<ll, ll> mll;
typedef queue<int> qi;
typedef queue<ii> qii;
typedef vector<string> vs;
typedef pair<ll, ll> iil;
typedef priority_queue<int> pqi;
typedef priority_queue<ii> pqii;
typedef priority_queue<ll> pqil;
typedef priority_queue<iil> pqiil;
typedef vector<iil> viil;
typedef vector<vi> vvi;
typedef long double ld;
typedef pair<int, ii> iii;
typedef pair<iil, ll> iiil;
typedef vector<pair<pair<int,int>,int> > viii;
typedef vector<pair<pair<ll,ll>,ll> > viiil;
typedef vector<vl> vvl;

#define pb push_back
#define mp make_pair
#define rep(i, n) for (int i = 0 ; i < n ; i++)
#define rrep(i, m, n) for (int i = m ; i < n ; i++)
#define per(i, n) for (int i = n - 1 ; i >= 0 ; i--)
#define perr(i, m, n) for (int i = n - 1 ; i >= m ; i--)
#define INF 2000000000
#define int long long

ll MOD = 1000000007;

viil adj[305];

vl ans[305];
ll dpU[305];
ll dpV[305];
ll distU[305];
ll distV[305];
ll distS[305];
ll tans;

void dfs(int n) {
    tans = min(tans, dpU[n] + distV[n]);
    tans = min(tans, dpV[n] + distU[n]);
    //cout << n << " " << dpU[n] << " " << dpV[n] << " " << distV[n] << " " << distU[n] << endl;
    /*cout << n << endl;
    for (ll a : ans[n]) {
        cout << a << " ";
    }
    cout << endl;*/
    for (ll a : ans[n]) {
        dfs(a);
    }
}

void solve() {
    ll n, m;
    cin >> n >> m;
    
    ll s, t;
    cin >> s >> t;
    
    s--; t--;
    
    ll u, v;
    cin >> u >> v;
    
    u--; v--;
    
    rep(i, m) {
        int a, b, c;
        cin >> a >> b >> c;
        
        a--; b--;
        adj[a].pb({b, c});
        adj[b].pb({a, c});
    }
    
    pqiil q;
    q.push({0, u});
    
    
    rep(i, n) distU[i] = 100000000000000000;
    
    while (q.size()) {
        iil inf = q.top();
        q.pop();
        
        ll ds = -inf.first;
        ll vt = inf.second;
        
        if (ds > distU[vt]) continue;
        
        distU[vt] = ds;
        
        
        for (iil a : adj[vt]) {
            if ((ds + a.second) <= distU[a.first]) {
                q.push({-(ds + a.second), a.first});
            }
        }
        
    }
    
    pqiil q2;
    q2.push({0, v});
    
    
    rep(i, n) distV[i] = 100000000000000000;
    
    while (q2.size()) {
        iil inf = q2.top();
        q2.pop();
        
        ll ds = -inf.first;
        ll vt = inf.second;
        
        if (ds > distV[vt]) continue;
        
        distV[vt] = ds;
        
        
        for (iil a : adj[vt]) {
            if (ds + a.second <= distV[a.first]) {
                q2.push({-(ds + a.second), a.first});
            }
        }
        
    }
    
    priority_queue<pair<ll, pair<ll, ll>>> q3;
    q3.push({0, {s, -1}});
    
    
    rep(i, n) distS[i] = 100000000000000000;
    
    rep(i, n) dpU[i] = 100000000000000000;
    
    rep(i, n) dpV[i] = 100000000000000000;
    
    while (q3.size()) {
        pair<ll, pair<ll, ll>> inf = q3.top();
        q3.pop();
        
        ll ds = -inf.first;
        ll vt = inf.second.first;
        ll ls = inf.second.second;
        
        if (ds > distS[vt]) continue;
        distS[vt] = ds;
        
        if (ls != -1) {
            ans[vt].pb(ls);
        }
        
        if (ls != -1) {
            dpU[vt] = min(dpU[vt], dpU[ls]);
            dpV[vt] = min(dpV[vt], dpV[ls]);
        }
        
        dpU[vt] = min(dpU[vt], distU[vt]);
        dpV[vt] = min(dpV[vt], distV[vt]);
        
        //cout << vt << " " << dpV[vt] << endl;
        
        for (iil a : adj[vt]) {
            if (ds + a.second <= distS[a.first]) {
                q3.push({-(ds + a.second), {a.first, vt}});
            }
        }
    }
    
    tans = 100000000000000000;
    
    /*rep(i, n) {
        cout << i << endl;
        rep(j, ans[i].size()) {
            cout << ans[i][j] << " ";
        }
        cout << endl;
        cout << endl;
    }*/
    //dfs(t);
    
    tans = min(tans, distU[v]);
    
    /*rep(i, n) {
        rep(j, ans[i].size()) {
           cout << ans[i][j] << " ";
        }
        cout << endl;
    }*/
    
    cout << tans << endl;
    
    
    cout << 300 << " " << 1000 << endl;
    
    
}

void querySolve() {
    int t;
    cin >> t;
    for (int i = 0 ; i < t ; i++) {
        solve();
    }
}

int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    solve();
    //querySolve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...