Submission #1350995

#TimeUsernameProblemLanguageResultExecution timeMemory
1350995rahidilbayramliCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
171 ms34172 KiB
#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define vl vector<ll>
#define vi vector<int>
#define pb push_back
#define sz(v) (ll)(v.size())
#define f first
#define s second
#define pll pair<ll, ll>
#define pii pair<int, int>
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
using namespace std;
const ll sz = 2e5+5;
vector<pll>g[sz];
vl par[sz], g2[sz], ord;
ll dist[3][sz], mn[2][sz];
bool vis[sz];
void dijkstra(ll node, ll tt, ll n)
{
    for(ll i = 0; i <= n; i++)
    {
        dist[tt][i] = 1000000000000000;
        vis[i] = 0;
    }
    dist[tt][node] = 0;
    priority_queue<pll>pq;
    pq.push({0, node});
    while(!pq.empty())
    {
        ll nd = pq.top().s;
        pq.pop();
        if(vis[nd])
            continue;
        vis[nd] = 1;
        for(auto [h, w] : g[nd])
        {
            if(dist[tt][h] > dist[tt][nd] + w)
            {
                dist[tt][h] = dist[tt][nd] + w;
                pq.push({-dist[tt][h], h});
            }
        }
    }
}
void d2(ll node, ll n)
{
    for(ll i = 0; i <= n; i++)
    {
        dist[2][i] = 1000000000000000;
        vis[i] = 0;
    }
    dist[2][node] = 0;
    priority_queue<pll>pq;
    pq.push({0, node});
    while(!pq.empty())
    {
        ll nd = pq.top().s;
        pq.pop();
        if(vis[nd])
            continue;
        vis[nd] = 1;
        for(auto [h, w] : g[nd])
        {
            if(dist[2][h] > dist[2][nd] + w)
            {
                dist[2][h] = dist[2][nd] + w;
                par[h].clear();
                par[h].pb(nd);
                pq.push({-dist[2][h], h});
            }
            else    if(dist[2][h] == dist[2][nd] + w)
                par[h].pb(nd);
        }
    }
}
void dfs(ll node)
{
    vis[node] = 1;
    for(auto u : par[node])
    {
        g2[u].pb(node);
        if(vis[u])
            continue;
        dfs(u);
    }
}
void dfs2(ll node)
{
    vis[node] = 1;
    for(auto u : g2[node])
    {
        if(vis[u])
            continue;
        dfs2(u);
    }
    ord.pb(node);
}
void solve()
{
    ll n, m, i, j;
    cin >> n >> m;
    ll u, v, s, t;
    cin >> s >> t;
    cin >> u >> v;
    for(i = 1; i <= m; i++)
    {
        ll x, y, z;
        cin >> x >> y >> z;
        g[x].pb({y, z});
        g[y].pb({x, z});
    }
    dijkstra(u, 0, n);
    dijkstra(v, 1, n);
    d2(s, n);
    for(i = 0; i <= n; i++)
        vis[i] = 0;
    dfs(t);
    for(i = 0; i <= n; i++)
        vis[i] = 0;
    dfs2(s);
    reverse(all(ord));
    for(i = 0; i <= n; i++)
        mn[0][i] = mn[1][i] = 1000000000000000;
    ll res = LLONG_MAX;
    for(auto h : ord)
    {
        for(j = 0; j < 2; j++)
        {
            mn[j][h] = min(mn[j][h], dist[j][h]);
            res = min(res, mn[j][h] + dist[1-j][h]);
        }
        for(auto r : g2[h])
        {
            for(j = 0; j < 2; j++)
                mn[j][r] = min(mn[j][r], mn[j][h]);
        }
    }
    cout << min(dist[0][v], res) << "\n";
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    ll tests = 1;
    //cin >> tests;
    while(tests--)
    {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...