Submission #1318672

#TimeUsernameProblemLanguageResultExecution timeMemory
1318672vuvietCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
374 ms23352 KiB
/**
 *     Author:       trviet
 *     Studies at:   Le Hong Phong High School for the Gifted
**/

#include <bits/stdc++.h>

using namespace std;
using lli = long long;

constexpr int maxn = 2e5 + 5;
constexpr long long inf = 1e18;

int n, m, src[4], mark[maxn];
lli d[4][maxn], ans = inf, dp[maxn][2];
vector<pair<int, int>> g[maxn];
vector<int> dag[maxn];

void Dijkstra(int k)
{
    fill(d[k], d[k] + 1 + n, inf);
    priority_queue<pair<lli, int>> pq;
    pq.push({0, src[k]});
    d[k][src[k]] = 0;
    while (!pq.empty())
    {
        int x = pq.top().second;
        pq.pop();
        for (int i = 0; i < g[x].size(); ++i)
        {
            int y = g[x][i].first, w = g[x][i].second;
            if (d[k][y] > d[k][x] + w)
            {
                d[k][y] = d[k][x] + w;
                pq.push({-d[k][y], y});
            }
        }
    }
}

void depth_search(int u)
{
    if (mark[u]) return;
    mark[u] = 1, dp[u][0] = dp[u][1] = inf;
    for (int v : dag[u])
    {
        depth_search(v);
        dp[u][0] = min(dp[u][0], min(dp[v][0], d[2][v]));
        dp[u][1] = min(dp[u][1], min(dp[v][1], d[3][v]));
    }
    ans = min(ans, dp[u][0] + d[3][u]);
    ans = min(ans, dp[u][1] + d[2][u]);
}

void ReadData()
{
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m;
    for (int i = 0; i < 4; ++i)
        cin >> src[i];
    for (int i = 0; i < m; ++i)
    {
        int x, y, w;
        cin >> x >> y >> w;
        g[x].push_back({y, w});
        g[y].push_back({x, w});
    }
}

void Solve()
{
    for (int i = 0; i < 4; ++i)
        Dijkstra(i);
    for (int i = 1; i <= n; ++i)
        for (int t = 0; t < g[i].size(); ++t)
        {
            int j = g[i][t].first, w = g[i][t].second;
            if (d[0][i] + w + d[1][j] == d[0][src[1]])
                dag[i].push_back(j);
        }
    depth_search(src[0]);
    cout << min(d[2][src[3]], ans);
}

int main()
{
    ReadData();
    Solve();
    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...