제출 #1109577

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

using namespace std;

const int N = 110000;

long long const inf = 1e18;

int n, m, s, t, u, v;

vector<pair<int, long long>> g[N];

vector<int> in[N], out[N];

long long min_dist[N];

long long D[N][4];

bool visited[N];

bool visit[N];

bool vst[N][4];

struct cmp{
    bool operator() (pair<long long, int> a, pair<long long, int> b) {
        return a.first > b.first;
    }
};

struct cmp2{
    bool operator() (pair<pair<long long, int>, int> a, pair<pair<long long, int>, int> b) {
        return a.first.first > b.first.first;
    }
};

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

    cin >> n >> m >> s >> t >> u >> v;

    int a, b;
    long long c;

    for (int i = 1; i <= m; i ++) {
        cin >> a >> b >> c;
        g[a].push_back({b, c});
        g[b].push_back({a, c});
    }

    priority_queue<pair<long long, int>, vector<pair<long long, int>>, cmp> pq;

    for (int i = 1; i <= n; i ++) {
        min_dist[i] = inf;
    }

    min_dist[s] = 0;

    pq.push({0, s});

    while(!pq.empty()) {
        auto [d, x] = pq.top();
        pq.pop();
        if (visited[x]) continue;
        visited[x] = true;
        for (pair<int, long long> e : g[x]) {
            if (min_dist[e.first] > e.second + d) {
                min_dist[e.first] = e.second + d;
                pq.push({e.second + d, e.first});
            }
        }
    }

    queue<int> q;
    q.push(t);

    while (!q.empty()) {
        int x = q.front();
        q.pop();

        if (visit[x]) continue;
        visit[x] = true;
        
        for (pair<int, long long> e : g[x]) {
            if (min_dist[e.first] + e.second == min_dist[x]) {
                
                in[x].push_back(e.first);
                out[e.first].push_back(x);
                q.push(e.first);
                

            }
        }
    }

    priority_queue<pair<pair<long long, int>, int>, vector<pair<pair<long long, int>, int>>, cmp2> pq2;

    for (int i = 1; i <= n; i ++) {
        D[i][0] = D[i][1] = D[i][2] = D[i][3] = inf;
    }

    D[u][0] = 0;

    pq2.push({{0, u}, 0});

    while (!pq2.empty()) {
        auto [p, t]  = pq2.top();
        auto [d, x] = p;
        pq2.pop();

        if (vst[x][t]) continue;

        vst[x][t] = true;

        if (t == 0) {
            for (int e : out[x]) {
                if (D[e][1] > d) {
                    D[e][1] = d;
                    pq2.push({{d, e}, 1});
                }
            }

            for (int e : in[x]) {
                if (D[e][2] > d) {
                    D[e][2] = d;
                    pq2.push({{d, e}, 2});
                }
            }

            for (auto e : g[x]) {
                if (D[e.first][0] > d + e.second) {
                    D[e.first][0] = d + e.second;
                    pq2.push({{d + e.second, e.first}, 0});
                }
            }
        }
        if (t == 1) {
            for (int e : out[x]) {
                if (D[e][1] > d) {
                    D[e][1] = d;
                    pq2.push({{d, e}, 1});
                }
            }

            for (auto e : g[x]) {
                if (D[e.first][3] > d + e.second) {
                    D[e.first][3] = d + e.second;
                    pq2.push({{d + e.second, e.first}, 3});
                }
            }
        }

        if (t == 2) {
            for (int e : in[x]) {
                if (D[e][2] > d) {
                    D[e][2] = d;
                    pq2.push({{d, e}, 2});
                }
            }

            for (auto e : g[x]) {
                if (D[e.first][3] > d + e.second) {
                    D[e.first][3] = d + e.second;
                    pq2.push({{d + e.second, e.first}, 3});
                }
            }
        }

        if (t == 3) {
            for (auto e : g[x]) {
                if (D[e.first][3] > d + e.second) {
                    D[e.first][3] = d + e.second;
                    pq2.push({{d + e.second, e.first}, 3});
                }
            }
        }
    }

    cout << min(min(D[v][0], D[v][1]), min(D[v][2], D[v][3]));

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:63:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   63 |         auto [d, x] = pq.top();
      |              ^
commuter_pass.cpp:108:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  108 |         auto [p, t]  = pq2.top();
      |              ^
commuter_pass.cpp:109:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  109 |         auto [d, x] = p;
      |              ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...