Submission #653303

#TimeUsernameProblemLanguageResultExecution timeMemory
653303TitanSlayerCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
686 ms36400 KiB
#include "bits/stdc++.h"
using namespace std;
#define ll long long
#define ld long double
#define vv vector
#define F first
#define S second
#define mp make_pair
#define pb push_back
#define mod 1000000007

typedef pair<ll, ll> pll;
typedef vv<ll> vll;
typedef vv<ld> vld;
typedef vv<pll> vpll;
typedef set<ll>::iterator sitr;

#define fastio                    \
    ios_base::sync_with_stdio(0); \
    cin.tie(0);
///////////////////////////////////

ll inf = 1e17;

void dijkstra(ll node, vll &dist, vv<vpll> &g)
{
    priority_queue<pll, vpll, greater<pll>> mh;
    mh.push({0, node});

    while (!mh.empty())
    {
        pll t = mh.top();
        mh.pop();

        if (dist[t.S] != inf)
            continue;
        dist[t.S] = t.F;
        for (ll i = 0; i < g[t.S].size(); i++)
            mh.push({t.F + g[t.S][i].S, g[t.S][i].F});
    }
}

void dfs(ll node, vll &dist1, vll &dist2, vll &vis, vv<vpll> &g, vll &top_sort, vv<vll> &valid_child_g, vv<vll> &valid_par_g, ll t)
{
    if (vis[node])
        return;
    vis[node] = 1;
    for (ll i = 0; i < g[node].size(); i++)
    {
        if (dist1[node] + g[node][i].S + dist2[g[node][i].F] == dist1[t])
        {
            dfs(g[node][i].F, dist1, dist2, vis, g, top_sort, valid_child_g, valid_par_g, t);
            valid_child_g[node].pb(g[node][i].F);
            valid_par_g[g[node][i].F].pb(node);
        }
    }
    top_sort.pb(node);
}

int main()
{
    fastio;
    ll T = 1;
    // cin >> T;
    while (T--)
    {
        ll i, j, a, b, c, n, m, u, v, s, t, node;
        cin >> n >> m;
        cin >> s >> t;
        cin >> u >> v;

        vv<vpll> g(n + 1);
        vv<vll> valid_child_g(n + 1), valid_par_g(n + 1);
        for (i = 0; i < m; i++)
        {
            cin >> a >> b >> c;
            g[a].pb({b, c});
            g[b].pb({a, c});
        }

        vll dS(n + 1, inf), dU(n + 1, inf), dV(n + 1, inf), dT(n + 1, inf);
        dijkstra(s, dS, g);
        dijkstra(u, dU, g);
        dijkstra(v, dV, g);
        dijkstra(t, dT, g);

        vll vis(n + 1, 0), top_sort;
        dfs(s, dS, dT, vis, g, top_sort, valid_child_g, valid_par_g, t);
        reverse(top_sort.begin(), top_sort.end());

        // for (i = 1; i <= n; i++)
        // {
        //     cout << i << ": ";
        //     for (j = 0; j < valid_child_g[i].size(); j++)
        //         cout << valid_child_g[i][j] << " ";
        //     cout << endl;
        // }

        // for (i = 1; i <= n; i++)
        // {
        //     cout << i << ": ";
        //     for (j = 0; j < valid_par_g[i].size(); j++)
        //         cout << valid_par_g[i][j] << " ";
        //     cout << endl;
        // }

        vll dp_child(n + 1, inf), dp_ancestor(n + 1, inf);
        for (i = top_sort.size() - 1; i >= 0; i--)
        {
            node = top_sort[i];
            dp_child[node] = dV[node];
            for (j = 0; j < valid_child_g[node].size(); j++)
                dp_child[node] = min(dp_child[node], dp_child[valid_child_g[node][j]]);
        }

        for (i = 0; i < top_sort.size(); i++)
        {
            node = top_sort[i];
            dp_ancestor[node] = dV[node];
            for (j = 0; j < valid_par_g[node].size(); j++)
                dp_ancestor[node] = min(dp_ancestor[node], dp_ancestor[valid_par_g[node][j]]);
        }

        // //
        // cout << endl;
        // for (i = 1; i <= n; i++)
        //     cout << dS[i] << " " << dU[i] << " " << dV[i] << " " << dT[i] << endl;
        // cout << endl;

        // for (auto i : top_sort)
        //     cout << i << " ";
        // cout << endl;

        // for (i = 1; i <= n; i++)
        //     cout << dp_child[i] << " ";
        // cout << endl;
        // for (i = 1; i <= n; i++)
        //     cout << dp_ancestor[i] << " ";
        // cout << endl;
        // //

        ll ans = dU[v];
        for (i = 0; i < top_sort.size(); i++)
            ans = min({ans, dU[top_sort[i]] + dp_child[top_sort[i]],
                       dU[top_sort[i]] + dp_ancestor[top_sort[i]]});
        cout << ans << endl;
    }
    return 0;
}

Compilation message (stderr)

commuter_pass.cpp: In function 'void dijkstra(long long int, vll&, std::vector<std::vector<std::pair<long long int, long long int> > >&)':
commuter_pass.cpp:38:26: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |         for (ll i = 0; i < g[t.S].size(); i++)
      |                        ~~^~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'void dfs(long long int, vll&, vll&, vll&, std::vector<std::vector<std::pair<long long int, long long int> > >&, vll&, std::vector<std::vector<long long int> >&, std::vector<std::vector<long long int> >&, long long int)':
commuter_pass.cpp:48:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |     for (ll i = 0; i < g[node].size(); i++)
      |                    ~~^~~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:112:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |             for (j = 0; j < valid_child_g[node].size(); j++)
      |                         ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:116:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |         for (i = 0; i < top_sort.size(); i++)
      |                     ~~^~~~~~~~~~~~~~~~~
commuter_pass.cpp:120:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  120 |             for (j = 0; j < valid_par_g[node].size(); j++)
      |                         ~~^~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:143:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  143 |         for (i = 0; i < top_sort.size(); i++)
      |                     ~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...