| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 676401 | borisAngelov | Commuter Pass (JOI18_commuter_pass) | C++11 | 0 ms | 0 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
const int maxn = 100005;
const long long inf = LLONG_MAX / 2;
vector<pair<long long, long long>> g[maxn];
long long du[maxn];
long long dv[maxn];
long long ds[maxn];
long long dp[2][maxn];
long long ans = 0;
void dijkstra1(long long start_node, long long dist[])
{
    fill(dist, dist + maxn, inf);
    priority_queue<pair<long long, long long>> pq;
    pq.push({0, start_node});
    dist[start_node] = 0;
    while (!pq.empty())
    {
        long long curr = -pq.top().first;
        long long node = pq.top().second;
        pq.pop();
        if (dist[node] < curr) continue;
        for (auto [v, w] : g[node])
        {
            long long path = curr + w;
            if (dist[v] > path)
            {
                dist[v] = path;
                pq.push({-path, v});
            }
        }
    }
}
void dijkstra2(long long beg_node, long long end_node)
{
    fill(dp[0], dp[0] + maxn, inf);
    fill(dp[1], dp[1] + maxn, inf);
    fill(ds, ds + maxn, inf);
    priority_queue<pair<long long, long>> pq;
    pq.push({0, beg_node});
    while (!pq.empty())
    {
        long long curr = -pq.top().first;
        long long node = pq.top().second;
        pq.pop();
        if (ds[node] < curr) continue;
        for (auto [v, w] : g[node])
        {
            long long path = curr + w;
            if (ds[v] > path)
            {
                ds[v] = path;
                pq.push({-path, v});
                dp[0][v] = min(du[v], dp[0][node]);
                dp[1][v] = min(dv[v], dp[1][node]);
            }
            else if (ds[v] == path)
            {
                if (min(du[v], dp[0][node]) + min(dv[v], dp[1][node]) <= dp[0][node] + dp[1][node])
                {
                    dp[0][node] = min(du[v], dp[0][node]);
                    dp[1][node] = min(dv[v], dp[1][node]);
                }
            }
        }
    }
    ans = min(ans, dp[0][end_node] + dp[1][end_node]);
}
void fastIO()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}
int main()
{
    fastIO();
    long long n, m, s, t, u, v;
    cin >> n >> m >> s >> t >> u >> v;
    for (int i = 1; i <= m; ++i)
    {
        long long x, y, w;
        cin >> x >> y >> w;
        g[x].push_back({y, w});
        g[y].push_back({x, w});
    }
    dijkstra1(u, du);
    dijkstra1(v, dv);
    ans = du[v];
    dijkstra2(s, t);
    dijkstra2(t, s);
    cout << ans << endl;
    return 0;
}
