Submission #1130766

#TimeUsernameProblemLanguageResultExecution timeMemory
1130766ChuanChenCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
742 ms33708 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int lim = 1e5+5; const ll inf = 1e18; int n, m, S, T, U, V; ll ans = inf; //ARESTAS struct Edge{ int a, b, c; }; vector<Edge> edges; vector<int> adj[lim], weight[lim]; void addEdge(int a, int b, int c){ edges.push_back({a, b, c}); adj[a].push_back(b); adj[b].push_back(a); weight[a].push_back(c); weight[b].push_back(c); } //DIJK FOR MIN_PATHS ll d[4][lim]; void dijk(int r){ set<pair<ll, int>> can; for(int i = 1; i <= n; i++) d[r][i] = inf; if(r == 0) d[r][S] = 0; else if(r == 1) d[r][T] = 0; else if(r == 2) d[r][U] = 0; else if(r == 3) d[r][V] = 0; for(int i = 1; i <= n; i++) can.emplace(d[r][i], i); while(!can.empty()){ int no = can.begin()->second; can.erase(can.begin()); for(int i = 0; i < adj[no].size(); i++){ int v = adj[no][i], p = weight[no][i]; if(d[r][v] > d[r][no] + p){ can.erase({d[r][v], v}); d[r][v] = d[r][no] + p; can.emplace(d[r][v], v); } } } } //DAGs vector<int> dag[2][lim]; ll dpU[2][lim], dpV[2][lim]; int ing[2][lim]; void solve(int r){ queue<int> can; for(int i = 1; i <= n; i++){ if(ing[r][i] == 0) can.push(i); } while(!can.empty()){ int no = can.front(); can.pop(); dpU[r][no] = min(dpU[r][no], d[2][no]); dpV[r][no] = min(dpV[r][no], d[3][no]); if(dag[r][no].empty()) continue; for(int v : dag[r][no]){ ing[r][v]--; if(ing[r][v] == 0) can.push(v); if(r == 0){ dpU[0][v] = min(dpU[0][v], dpU[0][no]); dpV[1][v] = min(dpV[1][v], dpV[1][no]); } else{ dpU[1][v] = min(dpU[1][v], dpU[1][no]); dpV[0][v] = min(dpV[0][v], dpV[0][no]); } } } } int main(){ cin.tie(0)->sync_with_stdio(0); cin >> n >> m; cin >> S >> T >> U >> V; for(int i = 1; i <= m; i++){ int a, b, c; cin >> a >> b >> c; addEdge(a, b, c); } for(int i = 0; i < 4; i++) dijk(i); for(Edge &e : edges){ if(d[0][e.a] + e.c + d[1][e.b] == d[0][T]){ dag[0][e.a].push_back(e.b); ing[0][e.b]++; dag[1][e.b].push_back(e.a); ing[1][e.a]++; } if(d[0][e.b] + e.c + d[1][e.a] == d[0][T]){ dag[1][e.a].push_back(e.b); ing[1][e.b]++; dag[0][e.b].push_back(e.a); ing[0][e.a]++; } } for(int i = 1; i <= n; i++) dpU[0][i] = dpV[0][i] = dpU[1][i] = dpV[1][i] = inf; solve(0); solve(1); ans = d[2][V]; for(int i = 1; i <= n; i++) ans = min({ans, dpU[0][i]+dpV[0][i], dpU[1][i]+dpV[1][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...