Submission #930316

#TimeUsernameProblemLanguageResultExecution timeMemory
930316LukapCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
643 ms44368 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXN = 1e5 + 500;
const ll INF = 1e16;

int n, m;
int s,t,u,v;
vector<pair<int, ll> > susjedi[MAXN], parent[MAXN], dag[MAXN];
int bio[MAXN], bio2[MAXN];
queue<int> q;
ll distu[MAXN], distv[MAXN], dists[MAXN];
pair<ll, ll> dp[MAXN];
ll rj = INF;

set<pair<ll, ll> > sett;

void bfs (int x) {
    for(int i = 0; i < n; i++){
        if(i == s){
            sett.insert(make_pair(0,s));
            dists[s] = 0;
            continue;
        }
        sett.insert(make_pair(INF,i));
        dists[i] = INF;
    }

    while(!sett.empty()){
        int x = (*sett.begin()).second;
        sett.erase(sett.begin());

        for (auto it: susjedi[x]) {
            int nx = it.first;
            if (dists[nx] > dists[x] + it.second) {
                sett.erase({dists[nx], nx});
                dists[nx] = dists[x] + it.second;
                sett.insert ({dists[nx], nx});
                parent[nx].clear ();
                parent[nx].push_back ({x, it.second});
            }
            else if (dists[nx] == dists[x] + it.second) {
                parent[nx].push_back ({x, it.second});
            }
        }
    }
}

void dfs (int x) {
    bio[x] = -2;
    for (auto nx: parent[x]) {
        dag[nx.first].push_back({x, nx.second});
        if (bio[nx.first] != -2) dfs (nx.first);
    }
}

void dijkstra(){
    for(int i = 0; i < n; i++){
        if(i == u){
            sett.insert(make_pair(0,u));
            distu[u] = 0;
            continue;
        }
        sett.insert(make_pair(INF,i));
        distu[i] = INF;
    }

    while(!sett.empty()){
        int x = (*sett.begin()).second;
        sett.erase(sett.begin());

        for (auto it: susjedi[x]) {
            int nx = it.first;
            if (distu[nx] > distu[x] + it.second) {
                sett.erase({distu[nx], nx});
                distu[nx] = distu[x] + it.second;
                sett.insert ({distu[nx], nx});
            }
        }
    }

    sett.clear ();
    for(int i = 0; i < n; i++){
        if(i == v){
            sett.insert(make_pair(0,v));
            distv[v] = 0;
            continue;
        }
        sett.insert(make_pair(INF,i));
        distv[i] = INF;
    }

    while(!sett.empty()){
        int x = (*sett.begin()).second;
        sett.erase(sett.begin());

        for (auto it: susjedi[x]) {
            int nx = it.first;
            if (distv[nx] > distv[x] + it.second) {
                sett.erase({distv[nx], nx});
                distv[nx] = distv[x] + it.second;
                sett.insert ({distv[nx], nx});
            }
        }
    }
}


void solve () {
    dijkstra ();
    for (int i = 0; i < n; i++) {
        if (bio[i] != -2) continue;
        dp[i].first = distu[i];
        dp[i].second = distv[i];
    }
    rj = distu[v];

    memset (bio2, -1, sizeof (bio2));
    q.push (s);
    bio2[s] = 0;
    while (!q.empty ()) {
        int x = q.front ();
        q.pop ();
        for (auto nx: dag[x]) {
            dp[nx.first].first = min (dp[nx.first].first, dp[x].first);
//            cout << "AAAAAA " << x << ' ' << nx.first << ' ' << dp[nx.first].first << ' ' << dp[nx.first].second << "\n";
            if (bio2[nx.first] == -1) {
                bio2[nx.first] = bio2[x] + 1;
                q.push (nx.first);
            }
        }
    }
    memset (bio2, -1, sizeof (bio2));
    q.push (t);
    bio2[t] = 0;
    while (!q.empty ()) {
        int x = q.front ();
        q.pop ();
        for (auto nx: parent[x]) {
            dp[nx.first].second = min (dp[nx.first].second, dp[x].second);
//            cout << "AAAAAAAAAAAA" << ' ' << x << ' ' << dp[x].second << ' ' << nx.first << ' ' << dp[nx.first].second << "\n";
            if (bio2[nx.first] == -1) {
                bio2[nx.first] = bio2[x] + 1;
                q.push (nx.first);
            }
        }
    }

    for (int i = 0; i < n; i++) {
        if (bio[i] != -2) continue;
        rj = min (rj, dp[i].first + dp[i].second);
        dp[i].first = distu[i];
        dp[i].second = distv[i];
    }

    memset (bio2, -1, sizeof (bio2));
    q.push (s);
    bio2[s] = 0;
    while (!q.empty ()) {
        int x = q.front ();
        q.pop ();
        for (auto nx: dag[x]) {
            dp[nx.first].second = min (dp[nx.first].second, dp[x].second);
//            cout << "AAAAAA " << x << ' ' << nx.first << ' ' << dp[nx.first].first << ' ' << dp[nx.first].second << "\n";
            if (bio2[nx.first] == -1) {
                bio2[nx.first] = bio2[x] + 1;
                q.push (nx.first);
            }
        }
    }
    memset (bio2, -1, sizeof (bio2));
    q.push (t);
    bio2[t] = 0;
    while (!q.empty ()) {
        int x = q.front ();
        q.pop ();
        for (auto nx: parent[x]) {
            dp[nx.first].first = min (dp[nx.first].first, dp[x].first);
//            cout << "AAAAAAAAAAAA" << ' ' << x << ' ' << dp[x].second << ' ' << nx.first << ' ' << dp[nx.first].second << "\n";
            if (bio2[nx.first] == -1) {
                bio2[nx.first] = bio2[x] + 1;
                q.push (nx.first);
            }
        }
    }

    for (int i = 0; i < n; i++) {
        if (bio[i] != -2) continue;
        rj = min (rj, dp[i].first + dp[i].second);
    }
}

int main () {
    ios_base::sync_with_stdio (false);
    cin.tie (0);
    memset (bio, -1, sizeof (bio));

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

    for (int i = 0; i < m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        a--;b--;
        susjedi[a].push_back ({b, c});
        susjedi[b].push_back ({a, c});
    }



    bfs (s);
    dfs (t);

    solve ();


    cout << rj;

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