제출 #1324907

#제출 시각아이디문제언어결과실행 시간메모리
1324907kenkunkinCommuter Pass (JOI18_commuter_pass)C++20
16 / 100
297 ms22260 KiB
#include <bits/stdc++.h>

using namespace std;

void Init()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

typedef long long ll;
const ll INF = 4e18;
const int maxn = 100005;

int n, m;
int S, T, U, V;

struct Edge
{
    int v;
    ll w;
};

vector<Edge> g[maxn];
vector<int> dag[maxn];

ll disS[maxn], disT[maxn], disU[maxn], disV[maxn];
ll best[maxn];
bool onPath[maxn];

void Dijkstra(int s, ll dis[])
{
    for (int i = 1; i <= n; i++) dis[i] = INF;

    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq;
    dis[s] = 0;
    pq.push({0, s});

    while (!pq.empty())
    {
        auto [d,u] = pq.top();
        pq.pop();

        if (d != dis[u]) continue;

        for (auto e : g[u])
        {
            int v = e.v;
            ll w = e.w;

            if (dis[v] > d + w)
            {
                dis[v] = d + w;
                pq.push({dis[v], v});
            }
        }
    }
}

void Input()
{
    cin >> n >> m;
    cin >> S >> T >> U >> V;

    for (int i = 1; i <= m; i++)
    {
        int u, v;
        ll w;
        cin >> u >> v >> w;

        g[u].push_back({v, w});
        g[v].push_back({u, w});
    }
}

void Bai()
{
    Dijkstra(S, disS);
    Dijkstra(T, disT);
    Dijkstra(U, disU);
    Dijkstra(V, disV);

    for (int u = 1; u <= n; u++)
    {
        for (auto e : g[u])
        {
            int v = e.v;
            ll w = e.w;

            if (disS[u] + w == disS[v])
            {
                dag[u].push_back(v);
            }
        }
    }

    for (int i = 1; i <= n; i++)
    {
        if (disS[i] + disT[i] == disS[T])
            onPath[i] = true;
        else
            onPath[i] = false;
    }

    vector<int> ord;
    ord.reserve(n);
    for (int i = 1; i <= n; i++)
        ord.push_back(i);

    sort(ord.begin(), ord.end(), [](int a, int b)
    {
        return disS[a] < disS[b];
    });

    for (int i = 1; i <= n; i++)
        best[i] = INF;

    for (int id = 0; id < n; id++)
    {
        int u = ord[id];

        if (onPath[u])
            best[u] = min(best[u], disU[u]);

        for (int v : dag[u])
        {
            best[v] = min(best[v], best[u]);
        }
    }

    ll ans = disU[V];

    for (int i = 1; i <= n; i++)
    {
        if (onPath[i])
        {
            if (best[i] != INF && disV[i] != INF)
                ans = min(ans, best[i] + disV[i]);
        }
    }

    cout << ans << "\n";
}

int main()
{
    Init();
    Input();
    Bai();
    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...