제출 #1097783

#제출 시각아이디문제언어결과실행 시간메모리
1097783tvgkCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
195 ms27132 KiB
#include<bits/stdc++.h>
using namespace std;
#define task "NETWORK"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 2e5 + 7;
const ll inf = 1e18;

int m, n, p[3];
vector<ii> w[mxN];
ll dp[10][mxN], mn[2][mxN];

void Dij(bool id)
{
    for (int i = 1; i <= n; i++)
        mn[id][i] = inf;
    mn[id][p[id]] = 0;

    priority_queue<ii, vector<ii>, greater<ii>> pq;
    pq.push({0, p[id]});
    while (pq.size())
    {
        ii j = pq.top();
        pq.pop();
        if (j.fi != mn[id][j.se])
            continue;

        for (ii i : w[j.se])
        {
            if (j.fi + i.se < mn[id][i.fi])
            {
                mn[id][i.fi] = j.fi + i.se;
                pq.push({j.fi + i.se, i.fi});
            }
        }
    }
}

void Solve(int stt)
{
    for (int i = 1; i <= n; i++)
    {
        for (int u = 1; u <= 4; u++)
            dp[u][i] = inf;
    }
    dp[4][stt] = 0;

    priority_queue<ii, vector<ii>, greater<ii>> pq;
    pq.push({0, stt});
    while (pq.size())
    {
        ii j = pq.top();
        pq.pop();
        if (j.fi != dp[4][j.se])
            continue;

        for (int i = 0; i <= 1; i++)
        {
            for (int u = 0; u < 4; u++)
                dp[u | (1 << i)][j.se] = min(dp[u | (1 << i)][j.se], dp[u][j.se] + mn[i][j.se]);
        }

        for (ii i : w[j.se])
        {
            if (j.fi + i.se < dp[4][i.fi])
            {
                for (int u = 1; u < 4; u++)
                    dp[u][i.fi] = inf;
                dp[4][i.fi] = j.fi + i.se;
                pq.push({j.fi + i.se, i.fi});
            }

            if (j.fi + i.se == dp[4][i.fi])
            {
                for (int u = 1; u < 4; u++)
                    dp[u][i.fi] = min(dp[u][i.fi], dp[u][j.se]);
            }
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n >> m;
    int stt, en;
    cin >> stt >> en;
    cin >> p[0] >> p[1];
    for (int i = 1; i <= m; i++)
    {
        int u, v, dis;
        cin >> u >> v >> dis;
        w[u].push_back({v, dis});
        w[v].push_back({u, dis});
    }
    for (int i = 0; i <= 1; i++)
        Dij(i);

    Solve(stt);
    cout << min(mn[0][p[1]], dp[3][en]);
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...