Submission #1216126

#TimeUsernameProblemLanguageResultExecution timeMemory
1216126kiennguyendinhCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
1578 ms27776 KiB
#include <bits/stdc++.h>
using namespace std;
int n,m,S,T,U,V,x,y;
long long res;
long long w;
vector<pair<int,long long>> adj[100001];
long long inf = 1e18;
vector<int> g[100001];
bool c[100001];
long long dist[4][100001];
long long opt[2][100001];
void dik(int t,int sta){
    for(int i = 1;i <= n;i++) dist[t][i] = inf;
    dist[t][sta] = 0;
    queue<int> q;
    q.push(sta);
    while(!q.empty()){
        int u = q.front();
        q.pop();
        for(pair<int,long long> &v : adj[u]){
            if(dist[t][v.first] > dist[t][u] + v.second){
                dist[t][v.first] = dist[t][u] + v.second;
                q.push(v.first);
            }
        }
    }
}
void build(int u){
    c[u] = true;
    for(pair<int,long long> v : adj[u]){
        if(dist[0][u] + v.second + dist[1][v.first] == dist[0][V]){
            g[u].push_back(v.first);
            if(!c[v.first]) build(v.first);
        }
    }
}
void dfs(int u){
    c[u] = true;
    opt[0][u] = dist[2][u];
    opt[1][u] = dist[3][u];
   for(int v : g[u]){
      if(!c[v]) dfs(v);
      opt[0][u] = min(opt[0][u],opt[0][v]);
      opt[1][u] = min(opt[1][u],opt[1][v]);
   }
   //cout << S << " to " << u << " " <<dist[2][u] << " " << opt[1][u] << "\n";
   //cout << T << " to " << u << " " << dist[3][u] << " " << opt[0][u] << "\n";
   res = min(res,dist[2][u] + opt[1][u]);
   res = min(res,dist[3][u] + opt[0][u]);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin >> n >> m >> U >> V >> S >> T;
    for(int i = 1;i <= m;i++){
        cin >> x >> y >> w;
        adj[x].push_back({y,w});
        adj[y].push_back({x,w});
    }
    dik(0,U);
    dik(1,V);
    dik(2,S);
    dik(3,T);
    build(U);
    res = dist[2][T];
    for(int i = 1;i <= n;i++) c[i] = false;
    dfs(U);
    cout << res;
    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...