Submission #499307

#TimeUsernameProblemLanguageResultExecution timeMemory
499307MarceantasyCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
366 ms23320 KiB
#include <bits/stdc++.h>
using namespace std; 

#define ll long long
#define ar array

const int mxN = 1e5+1, M = 1e9+7; 
int n, m, f[4], ord[mxN]; 
vector<ar<ll, 2>> adj[mxN];
ll dis[4][mxN], dp[mxN];

void dijkstra(ll* dist, int x){
    priority_queue<ar<ll, 2>, vector<ar<ll, 2>>, greater<ar<ll, 2>>> pq;
    pq.push({0, x});
    dist[x] = 0;
    while(pq.size()){
        ar<ll, 2> u = pq.top();
        pq.pop();

        //quiza esto está mal
        if(u[0] > dist[u[1]]) continue;
        for(ar<ll, 2> v : adj[u[1]]){
            if(dist[v[1]] > u[0]+v[0]){
                dist[v[1]] = u[0]+v[0];
                pq.push({dist[v[1]], v[1]});
            }
        }
    }
}

ll solve(int a, int b){
    iota(ord, ord+n, 0);
    memset(dp, 0, sizeof(dp));
    sort(ord, ord+n, [&](const int &p, const int &q){
        return dis[a][p] < dis[a][q];
    });
    ll ans = 1e18;
    for(int i = n-1; i>=0; --i){
        int x = ord[i];
        dp[x] = dis[3][x];
        for(ar<ll, 2> u : adj[x]){
            if(dis[a][x] + u[0] + dis[b][u[1]] == dis[a][f[b]]){
                dp[x] = min(dp[x], dp[u[1]]);
            }
        }
        ans = min(ans, dp[x] + dis[2][x]);
    }
    return ans;
}

int main(){
#ifdef _DEBUG
//	freopen("input.txt", "r", stdin);
//	freopen("output.txt", "w", stdout);
#endif
    std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0);

    cin >> n >> m;
    for(int i = 0; i<4; ++i){
        cin >> f[i];
        f[i]--;
    }
    for(int i = 0; i<m; ++i){
        int a, b, c; 
        cin >> a >> b >> c, --a, --b; 
        adj[a].push_back({c, b}); 
        adj[b].push_back({c, a});
    } 
    memset(dis, 0x3f, sizeof(dis));
    for(int i = 0; i<4; ++i){
        dijkstra(dis[i], f[i]);
    }
    ll ans = min(min(solve(0, 1), solve(1, 0)), dis[2][f[3]]);
    cout << ans << "\n"; 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...