Submission #1187550

#TimeUsernameProblemLanguageResultExecution timeMemory
1187550sergiomoncadamcCommuter Pass (JOI18_commuter_pass)C++20
31 / 100
203 ms27384 KiB
#include<bits/stdc++.h> using namespace std; #define endl '\n' using ll = long long; using ld = long double; #define pb push_back #define sz size() typedef pair<int, ll> pil; const int maxn = 1e5 + 1; const ll inf = 1e15; vector<vector<pil>> graph(maxn); vector<vector<int>> aux(maxn); vector<int> inDegree(maxn); struct comp{ bool operator() (pil a, pil b){ return a.second > b.second; } }; struct edge { int u, v; ll w; // Ordenar las aristas por el menor peso bool operator<(const edge& that) const { return w < that.w; // Cambiar '<' por '>' para hallar el Maximal Spanning Tree } }; // Complejidad O(m*log(n)) void dijkstra(int source, int n, vector<ll>& d, vector<int>& parent){ for(int i = 1; i <= n; i++){ d[i] = inf; parent[i] = -1; } d[source] = 0; priority_queue<pil, vector<pil>, comp> pq; pq.push({source, 0}); while(!pq.empty()){ int u = pq.top().first; ll w1 = pq.top().second; pq.pop(); if(d[u] < w1) continue; for(pil edge : graph[u]){ int v = edge.first; ll w2 = edge.second; if(d[v] > w1 + w2){ d[v] = w1 + w2; parent[v] = u; pq.push({v, d[v]}); } } } } void topoSort(int s, vector<int>& orden){ queue<int> q; q.push(s); orden.pb(s); while(!q.empty()){ int u = q.front(); q.pop(); for(int v : aux[u]){ inDegree[v]--; if(!inDegree[v]){ q.push(v); orden.pb(v); } } } } void createAuxGraph(int s, int t, vector<ll>& ds, vector<ll>& dt, vector<edge>& edges, vector<bool>& vertexes){ for(edge e : edges){ int u = e.u, v = e.v; ll w = e.w; if(ds[u] + w + dt[v] == ds[t]){ aux[u].pb(v); inDegree[v]++; vertexes[u] = 1; vertexes[v] = 1; } else if(ds[v] + w + dt[u] == ds[t]){ aux[v].pb(u); inDegree[u]++; vertexes[u] = 1; vertexes[v] = 1; } } } void solver(){ int n, m, s, t, u, v; cin>>n>>m>>s>>t>>u>>v; vector<edge> edges; for(int i = 0; i < m; i++){ int a, b; ll w; cin>>a>>b>>w; edges.pb({a, b, w}); graph[a].pb({b, w}); graph[b].pb({a, w}); } vector<ll> ds(n+1), dt(n+1), du(n+1), dv(n+1); vector<int> parentS(n+1), parentT(n+1), parentU(n+1), parentV(n+1); dijkstra(s, n, ds, parentS); dijkstra(t, n, dt, parentT); dijkstra(u, n, du, parentU); dijkstra(v, n, dv, parentV); vector<bool> vertexes(n+1); createAuxGraph(s, t, ds, dt, edges, vertexes); vector<int> orden; topoSort(s, orden); vector<ll> dpU(n+1, inf); for(int i = 0; i < orden.sz; i++){ int a = orden[i]; dpU[a] = du[a]; if(parentS[a] != -1 && vertexes[parentS[a]]) dpU[a] = min(dpU[a], dpU[parentS[a]]); } vector<ll> dpV(n+1, inf); for(int i = 0; i < orden.sz; i++){ int a = orden[i]; dpV[a] = dv[a]; if(parentS[a] != -1 && vertexes[parentS[a]]) dpV[a] = min(dpV[a], dpV[parentS[a]]); } ll ans = du[v]; for(int i = 0; i < orden.sz; i++) ans = min(ans, dpU[orden[i]] + dpV[orden[i]]); cout<<ans<<endl; } signed main(){ ios_base::sync_with_stdio(0);cin.tie(NULL); int t = 1; // cin>>t; while(t--){ solver(); } 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...