Submission #1356483

#TimeUsernameProblemLanguageResultExecution timeMemory
1356483roddddCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
308 ms19840 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long int lli;
typedef pair<int, int> pii;
typedef pair<lli, int> pli;
typedef tuple<lli, int, int> tli;

const int maxn = 1e5+10;
const lli inf = 1e18+10;

int N, M, S, T, U, V;
lli ans = inf;
lli du[maxn], dv[maxn], ds[maxn], dp[2][maxn];

bool mark[maxn];

vector<pii> graph[maxn];

void djk1(int x, lli arr[]){
    memset(mark, 0, sizeof(mark));
    for(int i=1; i<=N; i++) arr[i] = inf;
    arr[x] = 0;
    
    priority_queue<pli, vector<pli>, greater<pli>> pq;
    pq.push({0, x});
    
    while(!pq.empty()){
        auto[d, u] = pq.top(); pq.pop();
        
        if(mark[u]) continue;
        mark[u] = true;
        
        for(auto [v, w] : graph[u]){
            if(!mark[v]){
                arr[v] = min(arr[v], arr[u]+w);
                pq.push({arr[v], v});
            }
        }
    }
}

void djk2(int start, int end){
    for(int i=0; i<=N; i++) {dp[0][i] = inf; dp[1][i]=inf;}
    memset(mark, 0, sizeof(mark));
    
    priority_queue<tli, vector<tli>, greater<tli>> pq;
    pq.push({0, start, 0});
    
    while(!pq.empty()){
        auto[d, u, par] = pq.top(); pq.pop();
        
        if(!mark[u]){
            mark[u] = true;
            ds[u] = d;
            dp[0][u] = min(du[u], dp[0][par]);
            dp[1][u] = min(dp[0][u] + dv[u], dp[1][par]);
            
            for(auto [v, w] : graph[u]) pq.push({d+w, v, u});
        }
        else if(d==ds[u]){
            dp[0][u] = min(dp[0][u], dp[0][par]);
            dp[1][u] = min({dp[1][u], dp[1][par], dp[0][u] + dv[u]});
        }
    }
    
    ans = min(ans, dp[1][end]);
}

int main() {
	cin >>  N >> M >> S >> T >> U >> V;
	for(int i=0; i<M; i++){
	    int A, B, C; cin >> A >> B >> C;
	    graph[A].push_back({B, C});
	    graph[B].push_back({A, C});
	}
	
	djk1(U, du);
	djk1(V, dv);
	
	ans = du[V];
	
	djk2(S, T);
	djk2(T, S);
	
	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...