Submission #1270736

#TimeUsernameProblemLanguageResultExecution timeMemory
1270736flaming_top1Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
322 ms36088 KiB
#include <bits/stdc++.h>

#define SPED                                                                                                           \
    ios_base::sync_with_stdio(false);                                                                                  \
    cin.tie(0);                                                                                                        \
    cout.tie(0);

#define endl "\n"
#define fi first
#define se second
#define lint long long
#define fami signed
#define lore main
#define freefire freopen
#define Data tuple<int, int, lint>

const lint INF = 1e15;

using namespace std;

int n, m, s, t, ss, tt, in1[100005], in2[100005];
lint sdist[100005], tdist[100005], ssdist[100005], ttdist[100005], dp1[100005], dp2[100005];
vector<pair<int, lint>> adj[100005], adj1[100005], adj2[100005];
vector<Data> edges;

void dijkstra(int z, lint dist[])
{
    fill(dist + 1, dist + 1 + n, INF);
    dist[z] = 0;
    priority_queue<pair<lint, int>, vector<pair<lint, int>>, greater<pair<lint, int>>> pq;
    pq.emplace(0, z);
    while (!pq.empty())
    {
        auto [du, u] = pq.top();
        pq.pop();
        if (du > dist[u])
            continue;
        for (auto [v, w] : adj[u])
        {
            if (dist[v] > dist[u] + w)
            {
                dist[v] = dist[u] + w;
                pq.emplace(dist[v], v);
            }
        }
    }
}

void topo1()
{
    queue<int> temp;
    for (int i = 1; i <= n; i++)
    {
        if (in1[i] == 0)
            temp.emplace(i);
        dp1[i] = ssdist[i];
    }

    while (!temp.empty())
    {
        auto now = temp.front();
        temp.pop();
        for (auto [v, w] : adj1[now])
        {
            dp1[v] = min(dp1[v], dp1[now]);
            --in1[v];
            if (in1[v] == 0)    
                temp.emplace(v);
        }
    }
}

void topo2()
{
    queue<int> temp;
    for (int i = 1; i <= n; i++)
    {
        if (in2[i] == 0)
            temp.emplace(i);
        dp2[i] = ssdist[i];
    }

    while (!temp.empty())
    {
        auto now = temp.front();
        temp.pop();
        for (auto [v, w] : adj2[now])
        {
            dp2[v] = min(dp2[v], dp2[now]);
            --in2[v];
            if (in2[v] == 0)
                temp.emplace(v);
        }
    }
}

fami lore()
{
    SPED;
    cin >> n >> m;
    cin >> s >> t;
    cin >> ss >> tt;
    for (int i = 1; i <= m; i++)
    {
        int l, r;
        lint w;
        cin >> l >> r >> w;
        adj[l].emplace_back(r, w);
        adj[r].emplace_back(l, w);
        edges.emplace_back(l, r, w);
    }
    dijkstra(s, sdist);
    dijkstra(t, tdist);
    dijkstra(ss, ssdist);
    dijkstra(tt, ttdist);
    for (auto [u, v, w] : edges)
    {
        if (sdist[u] + w + tdist[v] == sdist[t])
        {
            adj1[u].emplace_back(v, w);
            in1[v]++;
            adj2[v].emplace_back(u, w);
            in2[u]++;
        }
        else if (sdist[v] + w + tdist[u] == sdist[t])
        {
            adj1[v].emplace_back(u, w);
            in1[u]++;
            adj2[u].emplace_back(v, w);
            in2[v]++;
        }
    }

    fill(dp1 + 1, dp1 + 1 + n, INF);
    fill(dp2 + 1, dp2 + 1 + n, INF);
    topo1();
    topo2();

    lint ans = ssdist[tt];
    for (int i = 1; i <= n; i++)
        ans = min(ans, min(dp1[i], dp2[i]) + ttdist[i]);
    cout << ans;
}
// Let your soul wander where dreams are born.
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...