Submission #678602

#TimeUsernameProblemLanguageResultExecution timeMemory
678602vjudge1Commuter Pass (JOI18_commuter_pass)C++17
24 / 100
34 ms1892 KiB
#include<bits/stdc++.h>
using namespace std;

#define f first
#define s second

typedef long long ll;
typedef long double ld;
typedef pair<int, pair<int, int>> ft;

const ld PI = acos(-1);
const int maxn = 3e3+5;
const ll inf = 1e18;
const int mod = 998244353;

int n, m, S, T, U, V;

ll ans = inf, stp;

ll ds[maxn], du[maxn], dv[maxn], dps[2][maxn], dpt[2][maxn];

int deg1[maxn], deg2[maxn], ing[maxn];

vector<pair<int, int>> graph[maxn];
vector<int> g1[maxn], g2[maxn];

void dijkstra(ll *d, int vt){
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
    for(int i = 1; i <= n; i++){
        d[i]=inf;
    }
    d[vt]=0;
    pq.push({0, vt});
    while(!pq.empty()){
        auto x = pq.top();
        //cout << x.f << "\n";
        pq.pop();
        if(d[x.s] < x.f)continue;
        for(auto v: graph[x.s]){
            if(x.f + v.s < d[v.f]){
                d[v.f] = x.f+v.s;
                pq.push({d[v.f], v.f});
            }
        }
    }
}

signed main(){
    cin >> n >> m >> S >> T >> U >> V;
    while(m--){
        int a, b, w;
        cin >> a >> b >> w;
        graph[a].push_back({b, w});
        graph[b].push_back({a, w});
    }
    dijkstra(ds, S);
    dijkstra(du, U);
    dijkstra(dv, V);
    queue<int> q;
    q.push(T);
    while(!q.empty()){
        auto x = q.front();
        q.pop();
        if(ing[x])continue;
        ing[x]=1;
        for(auto v: graph[x]){
            if(ds[v.f] + v.s == ds[x]){
                g1[v.f].push_back(x);
                g2[x].push_back(v.f);
                deg1[x]++;
                deg2[v.f]++;
                q.push(v.f);
            }
        }
    }
    for(int i = 1; i <= n; i++){
        dps[0][i] = dpt[0][i] = du[i];
        dps[1][i] = dpt[1][i] = dv[i];
    }
    q.push(S);
    while(!q.empty()){
        auto x = q.front();
        q.pop();
        for(auto v: g1[x]){
            dps[0][v] = min(dps[0][v], dps[0][x]);
            dps[1][v] = min(dps[1][v], dps[1][x]);
            deg1[v]--;
            if(!deg1[v])q.push(v);
        }
    }
    q.push(T);
    while(!q.empty()){
        auto x = q.front();
        q.pop();
        for(auto v: g1[x]){
            dpt[0][v] = min(dpt[0][v], dpt[0][x]);
            dpt[1][v] = min(dpt[1][v], dpt[1][x]);
            deg2[v]--;
            if(!deg2[v])q.push(v);
        }
    }
    ans = du[V];
    for(int i = 1; i <= n; i++){
        if(ing[i]){
            ans = min({ans, dps[0][i]+dpt[1][i], dps[1][i]+dpt[0][i]});
            //cout << i << "\n";
        }
    }
    cout << ans;
}
 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...