Submission #70785

#TimeUsernameProblemLanguageResultExecution timeMemory
70785someone_aaCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
919 ms23632 KiB
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define mp make_pair
using namespace std;
const int maxn = 100100;
ll dist[maxn][4], n, m, s, t, u, v;
ll dp[maxn][2];
bool visited[maxn];
vector<pair<ll,ll> > g[maxn];

/*
    dist[i][0] - dist to i from u
    dist[i][1] - dist to i from v
*/

void dijkstra(int start, int x) {
    memset(visited,false,sizeof(visited));
    for(int i=0;i<=n;i++) {
        dist[i][x] = 10000000LL * INT_MAX;
    }
    dist[start][x] = 0LL;
    //visited[start] = true;

    priority_queue<pair<ll,ll>, vector<pair<ll,ll> >, greater<pair<ll,ll> > > pq;
    pq.push(mp(0, start));

    while(!pq.empty()) {
        int curr = pq.top().second;
        pq.pop();
        if(visited[curr]) continue;
        visited[curr] = true;
        for(auto i:g[curr]) {
            if(dist[curr][x] + i.second < dist[i.first][x] && !visited[i.first]) {
                dist[i.first][x] = dist[curr][x] + i.second;
                pq.push(mp(dist[i.first][x], i.first));
            }
        }
    }
}

int main() {
    //ios_base::sync_with_stdio(false);
    //cin.tie(0);
    cin>>n>>m;
    cin>>s>>t;
    cin>>u>>v;

    ll x, y, z;
    for(int i=0;i<m;i++) {
        cin>>x>>y>>z;
        g[x].pb(mp(y,z));
        g[y].pb(mp(x,z));
    }

    dijkstra(u, 0);
    dijkstra(v, 1);

    for(int i=0;i<=n;i++) {
        dist[i][2] = dist[i][3] = LLONG_MAX;
        dp[i][0] = dp[i][1] = dist[i][1];
    }

    priority_queue<pair<ll,ll>, vector<pair<ll,ll> >, greater<pair<ll,ll> > > pq;
    pq.push(mp(0LL, s));
    dist[s][2] = 0LL;
    dp[s][0] = dist[s][1];
    while(!pq.empty()) {
        int curr = pq.top().second;
        int cdist = pq.top().first;
        pq.pop();
        for(auto i:g[curr]) {
            int ndist = cdist + i.second;
            if(dist[i.first][2] > ndist) {
                dist[i.first][2] = ndist;
                dp[i.first][0] = min(dp[i.first][0], dp[curr][0]);
                pq.push(mp(dist[i.first][2], i.first));
            }
            else if(dist[i.first][2] == ndist) {
                dp[i.first][0] = min(dp[i.first][0], dp[curr][0]);
            }
        }
    }
    pq.push(mp(0LL, t));
    dist[t][3] = 0LL;
    dp[t][1] = dist[t][1];
    while(!pq.empty()) {
        int curr = pq.top().second;
        int cdist = pq.top().first;
        pq.pop();
        for(auto i:g[curr]) {
            int ndist = cdist + i.second;
            if(dist[i.first][3] > ndist) {
                dist[i.first][3] = ndist;
                dp[i.first][1] = min(dp[i.first][1], dp[curr][1]);
                pq.push(mp(dist[i.first][3], i.first));
            }
            else if(dist[i.first][3] == ndist) {
                dp[i.first][1] = min(dp[i.first][1], dp[curr][1]);
            }
        }
    }
    ll result = dist[v][0];
    for(int i=1;i<=n;i++) {
        if(dist[i][2] + dist[i][3] == dist[t][2]) {
            //cout<<i<<": "<<dist[i][0]<<" "<<dp[i][0]<<" "<<dp[i][1]<<"\n";
            result = min(result, dist[i][0] + min(dp[i][0], dp[i][1]));
        }
    }
    cout<<result;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...