Submission #1316733

#TimeUsernameProblemLanguageResultExecution timeMemory
1316733aryanCommuter Pass (JOI18_commuter_pass)C++20
15 / 100
253 ms14688 KiB
#include<bits/stdc++.h>
using namespace std;

using i64 = long long;

struct Data{
    int v,w,i;
    Data() {};
    Data(int _v,int _w,int _i) {
        v = _v;
        w = _w;
        i = _i;
    }

};

int main(){
        
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n,m;
    cin >> n >> m;
    int s,t;
    cin >> s >> t;
    int u,v;
    cin >> u >> v;
    s --;
    t --;
    u --;
    v --;

    vector<vector<Data>> adj(n);
    for(int i = 0;i < m;i++){
        int a,b,w;
        cin >> a >> b >> w;
        a --;
        b --;
        adj[a].push_back(Data(b,w,i));
        adj[b].push_back(Data(a,w,i));
    }    

    const i64 inf = 1e18;
    vector<pair<int,int>> par(n,pair<int,int>{-1,-1});
    vector<i64> dist(n,inf);
    priority_queue<pair<i64,int>,vector<pair<i64,int>>,greater<pair<i64,int>>> pq;
    pq.push({0LL,s});
    dist[s] = 0;
    par[s] = {s,-1};

    while(!pq.empty()){
        auto p = pq.top();
        pq.pop();
        int a = p.second;
        i64 c = p.first;

        for(auto pp : adj[a]){
            int vv = pp.v;
            int w = pp.w;
            if(dist[vv] > w + c){
                dist[vv] = w + c;
                pq.push({w + c,vv});
                par[vv] = {a,pp.i};
            }
        }
    }
    
    vector<bool> is(m,false);
    int cur = t;
    while(true){
        auto p = par[cur];
        is[p.second] = true;
        if(p.first == s) break;
        cur = p.first;
    }
    for(int i = 0;i < n;i++){
        for(Data &d : adj[i]){
            if(is[d.i]) d.w = 0;
        }
    }

    dist = vector<i64>(n,inf);
    dist[u] = 0;
    pq.push({0LL,u});
    while(!pq.empty()){
        auto p = pq.top();
        pq.pop();
        int a = p.second;
        i64 c = p.first;

        for(auto pp : adj[a]){
            int vv = pp.v;
            int w = pp.w;
            if(dist[vv] > w + c){
                dist[vv] = w + c;
                pq.push({w + c,vv});
            }
        }
    }
    cout << dist[v] << '\n';

    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...