제출 #916752

#제출 시각아이디문제언어결과실행 시간메모리
916752codefoxCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
1058 ms53724 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pii pair<int, int>
#define pipii pair<int, pii>

int32_t main()
{
    int n, m;
    cin >> n >> m;
    int s, t, u, v;
    cin >> s >> t >> u >> v;
    s--; t--; u--; v--;

    vector<vector<pii>> graph(n);
    for (int i = 0; i < m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        a--; b--;
        graph[a].push_back({b, c});
        graph[b].push_back({a, c});
    }
    vector<int> dists(n, 1e18);
    vector<int> distt(n, 1e18);
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    pq.push({0, s});
    while (pq.size())
    {
        int d, i;
        tie(d, i) = pq.top();
        pq.pop();
        if (dists[i]!=1e18) continue;
        dists[i] = d;
        for (pii ele:graph[i])
        {
            pq.push({d+ele.second, ele.first});
        }
    }
    pq.push({0, t});
    while (pq.size())
    {
        int d, i;
        tie(d, i) = pq.top();
        pq.pop();
        if (distt[i]!=1e18) continue;
        distt[i] = d;
        for (pii ele:graph[i])
        {
            pq.push({d+ele.second, ele.first});
        }
    }
    int mn = 1e18;
    for (int i = 0; i < n; i++) mn = min(mn, dists[i]+distt[i]);

    vector<vector<int>> distu(n, vector<int>(4, 1e18));
    priority_queue<pipii, vector<pipii>, greater<pipii>> npq;
    npq.push({0, {u, 0}});
    while (npq.size())
    {
        int d;
        pii is;
        tie(d, is) = npq.top();
        int i = is.first;
        int s = is.second;
        npq.pop();
        if (distu[i][s]!=1e18) continue;
        distu[i][s] = d;
        for (pii ele:graph[i])
        {
            if (s==0) npq.push({d+ele.second, {ele.first, 0}});
            else npq.push({d+ele.second, {ele.first, 3}});
            if (dists[ele.first]+distt[ele.first]==mn && dists[i]+distt[i]==mn)
            {
                if (s==0)
                {
                    if (dists[ele.first]<dists[i]) npq.push({d, {ele.first, 1}});
                    else npq.push({d, {ele.first, 2}});
                }
                if (s==1)
                {
                    if (dists[ele.first]<dists[i]) npq.push({d, {ele.first, 1}});
                }
                if (s==2)
                {
                    if (dists[ele.first]>dists[i]) npq.push({d, {ele.first, 2}});
                }
            }
        }
    }
    mn = 1e18;
    for (int i = 0; i < 4; i++)
    {
        mn = min(mn, distu[v][i]);
    }
    cout << mn;

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