Submission #1318578

#TimeUsernameProblemLanguageResultExecution timeMemory
1318578vuvietCommuter Pass (JOI18_commuter_pass)C++20
16 / 100
198 ms25072 KiB
#include <bits/stdc++.h>

using namespace std;
using pii = pair<int, int>;
using lli = long long;

constexpr int maxn = 2e5 + 5;
vector<pii> g[maxn], adj[maxn];
int n, m, s, t, u, v;

struct Edge
{
    int x, y, w;
} elist[maxn];

vector<lli> Dijkstra(int src, vector<pii> g[maxn])
{
    vector<lli> dp(n + 1, 1e18);
    priority_queue<pair<lli, int>> pq;
    pq.push({0, src});
    dp[src] = 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 (dp[y] > dp[x] + w)
            {
                dp[y] = dp[x] + w;
                pq.push({-dp[y], y});
            }
        }
    }
    return dp;
}

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

void Solve()
{
    vector<lli> d = Dijkstra(s, g), f = Dijkstra(t, g);
    lli D = d[t];
    for (int i = 0; i < m; ++i)
    {
        int x = elist[i].x, y = elist[i].y, w = elist[i].w;
        if (d[x] + w + f[y] == D)
            adj[x].push_back({y, 0});
        if (d[y] + w + f[x] == D)
            adj[y].push_back({x, 0});
        adj[x].push_back({y, w});
        adj[y].push_back({x, w});
    }
    vector<lli> best = Dijkstra(u, adj);
    cout << best[v];
}

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...