제출 #851612

#제출 시각아이디문제언어결과실행 시간메모리
851612chuongdanCommuter Pass (JOI18_commuter_pass)C++14
31 / 100
231 ms82328 KiB
#include <bits/stdc++.h>
#define N 1000000
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define int long long
#define rep(i, l, r) for(int i = l; i <= r; i++)
#define reprev(i, l, r) for(int i = l; i >= r; i--)

using namespace std;

typedef pair<int,int> i2;
typedef pair<i2,int> i3;
typedef pair<i2, i2> i4;

const int INF = 1e18;
const int MOD = 1e9 + 7;

int n, m, s, t, x, y;
int dp[N+5][2], dpu[N+5];
i3 edge[N+5];
vector<i2> g[N+5], g2[N+5];

void dijkstra(int start, int oper){
    rep(i, 1, n) dp[i][oper] = INF;
    priority_queue<i2, vector<i2>, greater<i2>> heap;
    dp[start][oper] = 0;
    heap.push(mp(0, start));
    while (heap.size()){
        i2 cur = heap.top(); heap.pop();
        if (cur.fi > dp[cur.se][oper]) continue;
        int u = cur.se;
        for(auto p: g[u]){
            int v = p.fi, w = p.se;
            if (dp[v][oper] > cur.fi + w){
                dp[v][oper] = cur.fi + w;
                heap.push(mp(dp[v][oper], v));
            }
        }
    }
}

void dijkstra_u(){
    rep(i, 1, n) dpu[i] = INF;
    priority_queue<i2, vector<i2>, greater<i2>> heap;
    dpu[x] = 0;
    heap.push(mp(0, x));
    while (heap.size()){
        i2 cur = heap.top(); heap.pop();
        if (cur.fi > dpu[cur.se]) continue;
        int u = cur.se;
        for(auto p: g2[u]){
            int v = p.fi, w = p.se;
            if (dpu[v] > cur.fi + w){
                dpu[v] = cur.fi + w;
                heap.push(mp(dpu[v], v));
            }
        }
    }
}

void solve(){
    cin >> n >> m >> s >> t >> x >> y;
    rep(i, 1, m) {
        cin >> edge[i].fi.fi >> edge[i].fi.se >> edge[i].se;
        g[edge[i].fi.fi].pb(mp(edge[i].fi.se, edge[i].se));
        g[edge[i].fi.se].pb(mp(edge[i].fi.fi, edge[i].se));
    }
    dijkstra(s, 0);
    dijkstra(t, 1);
    rep(i, 1, m){
        int u = edge[i].fi.fi, v = edge[i].fi.se, w = edge[i].se;
        if (dp[u][0] + dp[v][1] + w == dp[t][0] || dp[u][1] + dp[v][0] + w == dp[t][0]){
            g2[u].pb({v, 0});
            g2[v].pb({u, 0});
        } else {
            g2[u].pb({v, w});
            g2[v].pb({u, w});
        }
    }
    dijkstra_u();
    cout << dpu[y];
}  

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    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...