Submission #1314047

#TimeUsernameProblemLanguageResultExecution timeMemory
1314047thaibaotran555Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
408 ms88608 KiB
///TRAN THAI BAO :3 #include <iostream> #include <cstdio> #include <vector> #include <queue> using namespace std; #define maxN 100007 #define oo 1e18 typedef pair<long long, long long> pii; typedef pair<pii, long long> piii; int n, m; priority_queue<pii, vector<pii>, greater<pii> >pq; priority_queue<piii, vector<piii>, greater<piii> >pq2; vector<pii>orgAdj[maxN]; vector<piii>adj[maxN][4]; bool vis[maxN] = {false}; int S, T, X, Y; long long orgMinD[maxN]; long long minD[maxN][4]; pii pre[maxN] = {{0, 0}}; void readData() { cin >> n >> m >> S >> T >> X >> Y; int u, v, w; for(int i = 0; i < m; i++) { cin >> u >> v >> w; orgAdj[u].push_back({v, w}); orgAdj[v].push_back({u, w}); adj[u][0].push_back({{v, w}, 0}); adj[v][0].push_back({{u, w}, 0}); adj[u][3].push_back({{v, w}, 3}); adj[v][3].push_back({{u, w}, 3}); } } void dfsPre(int u) { vis[u] = true; int v; long long w; for(int i = 0; i < orgAdj[u].size(); i++) { v = orgAdj[u][i].first; w = orgAdj[u][i].second; if(orgMinD[v] + w == orgMinD[u]) { adj[v][1].push_back({{u, 0}, 1}); adj[u][2].push_back({{v, 0}, 2}); if(!vis[v]) dfsPre(v); } } } void dijkstra() { for(int i = 1; i <= n; i++) orgMinD[i] = oo; orgMinD[S] = 0; pq.push({orgMinD[S], S}); while(!pq.empty()) { int cur = pq.top().second; long long w = pq.top().first; pq.pop(); if(orgMinD[cur] != w) continue; for(int i = 0; i < orgAdj[cur].size(); i++) { w = orgAdj[cur][i].second; int v = orgAdj[cur][i].first; if(orgMinD[v] > orgMinD[cur] + w) { orgMinD[v] = orgMinD[cur] + w; pq.push({orgMinD[v], v}); } } } dfsPre(T); for(int i = 1; i <= n; i++) { adj[i][0].push_back({{i, 0}, 1}); adj[i][0].push_back({{i, 0}, 2}); adj[i][1].push_back({{i, 0}, 3}); adj[i][2].push_back({{i, 0}, 3}); } } void solve() { for(int i = 1; i <= n; i++) { minD[i][0] = oo; minD[i][1] = oo; minD[i][2] = oo; minD[i][3] = oo; } minD[X][0] = 0; pq2.push({{minD[X][0], X}, 0}); while(!pq2.empty()) { int layer = pq2.top().second; int cur = pq2.top().first.second; long long w = pq2.top().first.first; pq2.pop(); if(minD[cur][layer] != w) continue; for(int i = 0; i < adj[cur][layer].size(); i++) { int v = adj[cur][layer][i].first.first; w =adj[cur][layer][i].first.second; int vLay = adj[cur][layer][i].second; if(minD[v][vLay] > minD[cur][layer] + w) { minD[v][vLay] = minD[cur][layer]+w; pq2.push({{minD[v][vLay], v}, vLay}); } } } cout << minD[Y][3]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); readData(); dijkstra(); solve(); 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...