제출 #1305663

#제출 시각아이디문제언어결과실행 시간메모리
1305663ngocphuCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
415 ms48288 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const long long INF = 2000000000000000000LL;
const int maxN = 1e5 + 4;
const int LOG = 18;
const int dx[] = {1,-1,0,0};
const int dy[] = {0,0,1,-1};
const int MOD = 1e9 + 7;
const int base = 311;

int n, m, s, t, x, y;
vector<pair<int,int>> E[maxN], G[4 * maxN];
ll D[2][maxN], P[4 * maxN];

void dijk(int st, int k)
{
    for (int i = 1; i <= n; ++i) D[k][i] = 1e18;

    D[k][st] = 0;
    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> q;
    q.push({0, st});

    while(!q.empty())
    {
        pair<ll,int> h = q.top(); q.pop();

        int u = h.second;
        ll w = h.first;

        if (w > D[k][u]) continue;

        for (pair<int,int> x : E[u])
        {
            int v = x.first, weight = x.second;
            if (D[k][v] > D[k][u] + weight)
            {
                D[k][v] = D[k][u] + weight;
                q.push({D[k][v], v});
            }
        }
    }
}

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

    // freopen(".INP","r",stdin);
    // freopen(".OUT","w",stdout);

    cin >> n >> m >> s >> t >> x >> y;

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

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

    dijk(s, 0);
    dijk(t, 1);

    for (int u = 1; u <= n; ++u)
    {
        G[u].push_back({n + u, 0});
        G[u].push_back({2 * n + u, 0});
        G[n + u].push_back({3 * n + u, 0});
        G[2 * n + u].push_back({3 * n + u, 0});

        for (pair<int,int> x : E[u])
        {
            int v = x.first, w = x.second;

            if (D[0][u] + w + D[1][v] == D[0][t])
            {
                G[n + u].push_back({n + v, 0});
                G[2 * n + v].push_back({2 * n + u, 0});
            }

            G[u].push_back({v, w});
            G[3 * n + u].push_back({3 * n + v, w});
        }
    }

    for (int i = 1; i <= 4 * n; ++i) P[i] = 1e18;
    P[x] = 0;
    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> q;

    q.push({0, x});

    while(!q.empty())
    {
        pair<ll,int> h = q.top(); q.pop();

        ll w = h.first;
        int u = h.second;

        if (w > P[u]) continue;

        for (pair<int,int> x : G[u])
        {
            int v = x.first, weight = x.second;
            if (P[v] > P[u] + weight)
            {
                P[v] = P[u] + weight;
                q.push({P[v], v});
            }
        }
    }

    cout << P[3 * n + y];

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