Submission #1356439

#TimeUsernameProblemLanguageResultExecution timeMemory
1356439roddddCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
319 ms327680 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, vector<int>> tli;

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

int N, M, S, T, U, V;
lli dist[maxn];
lli dist2[maxn];

vector<pii> graph[maxn];

void djk2(vector<int> free_graph[]){
    for(int i=1; i<=N; i++) dist2[i] = inf;
    dist2[U] = 0;
    
    priority_queue<pli, vector<pli>, greater<pli>> pq;
    pq.push({0, U});
    
    while(!pq.empty()){
        auto[d, u] = pq.top(); pq.pop();
        
        if(dist2[u] < d) continue;
        
        for(auto v : free_graph[u]){
            if(dist2[v] > dist2[u]){
                dist2[v] = dist2[u];
                pq.push({dist2[v], v});
            }
        }
        
        for(auto [v, w] : graph[u]){
            if(dist2[v] > dist2[u]+w){
                dist2[v] = dist2[u]+w;
                pq.push({dist2[v], v});
            }
        }
    }
    
}

lli djk1(){
    for(int i=1; i<=N; i++) dist[i] = inf;
    dist[S] = 0;
    
    priority_queue<tli, vector<tli>, greater<tli>> pq;
    pq.push({0, S, {}});
    
    lli ans=inf;
    
    while(!pq.empty()){
        auto[d, u, r] = pq.top(); pq.pop();
        vector<int> aux = r;
        aux.push_back(u);
        
        if(dist[u] < d) continue;
        
        if(u==T){
            vector<int> f_graph[maxn];
            for(int i=1; i<(int)aux.size(); i++){
                int A = aux[i], B=aux[i-1];
                f_graph[A].push_back(B);
                f_graph[B].push_back(A);
            }
            djk2(f_graph);
                
            ans = min(ans, dist2[V]);
        }
        
        for(auto [v, w] : graph[u]){
            if(dist[v] >= dist[u]+w){
                dist[v] = dist[u]+w;
                pq.push({dist[v], v, aux});
            }
        }
    }
    
    return ans;
}

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});
	}
	
	cout << djk1() << "\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...