Submission #453425

#TimeUsernameProblemLanguageResultExecution timeMemory
453425KarliverCommuter Pass (JOI18_commuter_pass)C++14
15 / 100
780 ms29672 KiB
    
#include <bits/stdc++.h>

#define FIXED_FLOAT(x)  std::fixed <<std::setprecision(20) << (x)
#define all(v) (v).begin(), (v).end()
using namespace  std;
#define forn(i,n) for (int i = 0; i < (n); ++i)
#define rforn(i, n) for(int i = (n) - 1;i >= 0;--i)
using ll = long long;
int mod = (ll)1e9 + 7;
#define PI acos(-1)
typedef pair<ll, ll> pairs;

const ll INF = 2e18;
const int N = 2e5 + 100;
const double eps = 1e-7;

template <class T> using V = vector<T>;  
template <class T> using VV = V<V<T>>;  

template <typename XPAX>
void ckma(XPAX &x, XPAX y) {
    x = (x < y ? y : x);
}
template <typename XPAX>
void ckmi(XPAX &x, XPAX y) {
    x = (x > y ? y : x);
}
ll du[N], dv[N], ds[N];
ll dp[N][3], ans = INF;
V<bool> vis(N, false);
VV<pairs> g(N);
ll n;

void Dx(ll st, ll d[]) {
    fill(all(vis), false);

    priority_queue<pairs> q;
    q.emplace(0, st);

    while(q.size()) {
        auto [s, v] = q.top();q.pop();

        if(!vis[v]) {
            d[v] = -s;
            vis[v] = 1;
            for(auto [c, w] : g[v]) q.push({s - w, c});
        }
    }

}


void Dy(ll st, ll e) {
    forn(i, n + 1) dp[i][0] = dp[i][1] = INF;

    forn(i, n + 1) vis[i] = false;
    using P = tuple<int, int, int>;
    priority_queue<P> q;
    q.emplace(0, st, 0);

    while(q.size()) {
        auto [s, v, par] = q.top();
        q.pop();

        if(!vis[v]) {
            ds[v] = -s;
            vis[v] = 1;
            dp[v][0] = min(du[v], dp[par][0]);
            dp[v][1] = min(dv[v], dp[par][1]);

            for(auto [c, w] : g[v]) q.emplace(s - w, c, v);
        }
        else if(-s == ds[v]) {
            if(min(du[v], dp[par][0]) + min(dv[v], dp[par][1]) <= dp[v][0] + dp[v][1]) {
                dp[v][0] = min(du[v], dp[par][0]);

                dp[v][1] = min(dv[v], dp[par][1]);
            }
        }
    }

    ckmi(ans, dp[e][0] + dp[e][1]);
}
            
    

void solve() {


    int m, s, t, u, v;
    cin>> n >> m>> s >> t >> u >> v;

    forn(i, m) {
        int a, b,c;
         cin >> a >> b >> c;
         g[a].push_back({b, c});
         g[b].push_back({a,c});
     }

     Dx(u, du);

     Dx(v, dv);

     ans = du[v];

     Dy(s, t);
     Dy(t, s);

     cout << ans << '\n';

}
void test_case() {
    int t;
    cin >> t;
    forn(p, t) {

        //cout << "Case #" << p + 1 << ": ";
        solve();
    }
}
int main() {

    ios::sync_with_stdio(false);
    cin.tie(0);

    solve();

}

Compilation message (stderr)

commuter_pass.cpp: In function 'void Dx(ll, ll*)':
commuter_pass.cpp:42:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   42 |         auto [s, v] = q.top();q.pop();
      |              ^
commuter_pass.cpp:47:22: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   47 |             for(auto [c, w] : g[v]) q.push({s - w, c});
      |                      ^
commuter_pass.cpp: In function 'void Dy(ll, ll)':
commuter_pass.cpp:63:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   63 |         auto [s, v, par] = q.top();
      |              ^
commuter_pass.cpp:72:22: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   72 |             for(auto [c, w] : g[v]) q.emplace(s - w, c, v);
      |                      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...