제출 #1267167

#제출 시각아이디문제언어결과실행 시간메모리
1267167cmiucCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
443 ms40924 KiB
#include <iostream>
#include <set>
#include <vector>

using namespace std;
#define int long long
const int N = 2e5 + 10;
int dist[5][N], seen[N], a[N], b[N], c[N], U[N], V[N];
vector<pair<int,int>> nei[N];
vector<int> dag[N], vec;

void dfs(int u){
    seen[u] = 1;
    for (int i : dag[u]){
        if (seen[i] == 0)
            dfs(i);
    }
    // cout<<u<<endl;
    vec.push_back(u);
}

void dijkstra(int s, int id){
    for (int i=1;i<N;i++)
        dist[id][i] = U[i] = V[i] = 1e17;
    dist[id][s] = 0;
    set<pair<int,int>> st = {{0, s}};

    while (st.size() > 0){
        auto [dt, u] = *begin(st);
        st.erase(begin(st));

        for (auto [i, w] : nei[u]){
            if (dist[id][i] > dist[id][u] + w){
                st.erase({dist[id][i], i});
                dist[id][i] = dist[id][u] + w;
                st.insert({dist[id][i], i});
            }
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int n, m, s, t, u, v;
    cin>>n>>m>>s>>t>>u>>v;

    for (int i=1;i<=m;i++){
        cin>>a[i]>>b[i]>>c[i];

        nei[a[i]].push_back({b[i], c[i]});
        nei[b[i]].push_back({a[i], c[i]});
    }

    dijkstra(u, 1);
    dijkstra(v, 2);
    dijkstra(s, 3);
    dijkstra(t, 4);

    for (int i=1;i<=m;i++){
        for (int j : {0, 1}){
            swap(a[i], b[i]);
            if (dist[3][a[i]] + dist[4][b[i]] + c[i] == dist[3][t])
                dag[a[i]].push_back(b[i]);
        }
    }

    for (int i=1;i<=n;i++){
        if (!seen[i])
            dfs(i);
    }
    int Ans = dist[1][v];
    for (int i : vec){
        U[i] = dist[1][i];
        V[i] = dist[2][i];
        for (int j : dag[i]){
            U[i] = min(U[i], U[j]);
            V[i] = min(V[i], V[j]);
        }

        Ans = min(Ans, min(dist[1][i] + V[i], dist[2][i] + U[i]));
    }
    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...