Submission #1040668

#TimeUsernameProblemLanguageResultExecution timeMemory
1040668vjudge1Commuter Pass (JOI18_commuter_pass)C++17
31 / 100
199 ms111860 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ld long double
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<long long, long long>
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define pb push_back
#define lwb lower_bound
#define upb upper_bound

#define TASKNAME "NAME"

void init()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    ///freopen(TASKNAME".INP","r",stdin); freopen(TASKNAME".OUT","w",stdout);
}

const int maxN = 1e6+5;
const ll INF = INT_MAX / 2, MOD = 1e9+7, INFLL = 2e18;
const double epsilon = 1e-3;

struct Edge
{
    ll u,v,w;
    Edge(ll _u = 0, ll _v = 0, ll _w = 0) : u(_u), v(_v), w(_w) {}
};

struct Node
{
    ll u, dist;
    Node(ll _u = 0, ll _dist = 0) : u(_u), dist(_dist) {}

    bool operator < (const Node& other) const
    {
        return dist > other.dist;
    }
};

int n, m, a, b, c, d3;
ll d[maxN][3];
priority_queue<Node> pq;
vector<pll> adj[maxN];
vector<Edge> edges;

void dijkstra(int s, int t)
{
    for(int i = 1; i <= n; i++)
    {
        d[i][t] = INFLL;
    }
    pq.push({s, 0});
    d[s][t] = 0;
    while(!pq.empty())
    {
        int u = pq.top().u;
        ll dist = pq.top().dist;
        pq.pop();
        if(dist > d[u][t]) continue;
        for(pll e : adj[u])
        {
            int v = e.fi;
            ll w = e.se;
            if(d[v][t] > d[u][t] + w)
            {
                d[v][t] = d[u][t] + w;
                pq.push({v, d[v][t]});
            }
        }
    }
}

int vis[maxN], vis2[maxN];
ll res = INFLL, dp[maxN], mnc[maxN], mnd[maxN];
vector<int> topo, dag[maxN], rdag[maxN];

void dfs(int u)
{
    vis[u] = 1;
    for(int v : dag[u])
    {
        if(vis[v] == 0)
            dfs(v);
    }
    topo.pb(u);
    vis[u] = 2;
}

void dfs2(int u)
{
    vis2[u] = 1;
    for(int v : rdag[u])
    {
        if(!vis2[v]) dfs2(v);
    }
}

int main()
{
    init();
    cin >> n >> m >> a >> b >> c >> d3;
    for(int i = 1; i <= m; i++)
    {
        ll u,v,w;
        cin >> u >> v >> w;
        adj[u].pb({v, w});
        adj[v].pb({u, w});
        edges.pb({u, v, w});
    }
    dijkstra(a, 0);
    for(Edge e : edges)
    {
        ll u = e.u, v = e.v, w = e.w;
        if(d[v][0] == d[u][0] + w)
        {
            dag[u].pb(v);
            rdag[v].pb(u);
            //cout << u << " -> " << v << '\n';
        }
        else if(d[u][0] == d[v][0] + w)
        {
            dag[v].pb(u);
            rdag[u].pb(v);
            //cout << v << " -> " << u << '\n';
        }
    }
    dijkstra(c, 1);
    dijkstra(d3, 2);
    dfs(a);
    dfs2(b);
    reverse(all(topo));
    for(int i = 1; i <= n; i++)
    {
        dp[i] = INFLL;
        mnc[i] = INFLL;
        mnd[i] = INFLL;
    }
    dp[a] = d[a][1] + d[a][2];
    mnc[a] = d[a][1];
    mnd[a] = d[a][2];
    for(int u : topo)
    {
        if(vis2[u] == 1)
            res = min(res, dp[u]);
        //cout << u << " " << dp[u] << '\n';
        for(int v : dag[u])
        {
            mnc[v] = min({mnc[v], mnc[u], d[v][1] });
            mnd[v] = min({mnd[v], mnd[u], d[v][2] });
            dp[v] = min(dp[v], min(dp[u], min(mnc[u], d[v][1]) + min(mnd[u], d[v][2]) ) );
        }
    }
    res = min(res, d[d3][1]);
    cout << res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...