제출 #1337941

#제출 시각아이디문제언어결과실행 시간메모리
1337941top1svtinCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
389 ms24940 KiB
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")

#include <bits/stdc++.h>

using namespace std;

#define kien long long
#define pb push_back
#define FOR(i, a, b) for (int i = a;i <= b; i++)
#define FORD(i, a, b) for (int i = a;i >= b; i--)
#define pii pair<int, int>
#define dembit(a) __builtin_popcountll(a)
#define task "a"
#define fin(x) freopen(x".inp","r",stdin)
#define fou(x) freopen(x".out","w",stdout)
#define debug(x) cout << x << " ";
#define down cout << "\n"

const kien MOD = 1e9 + 7;
const int Million = 1e6 + 5;
const int MXN = 1e5 + 5;

kien n, m;
kien s, t, cu, cv;

vector<pair<kien,kien>> g[MXN];

void dijkstra(vector<kien> &d, kien s) {
    priority_queue<pair<kien,kien>> pq;

    d[s] = 0;
    pq.push({0, s});

    while(!pq.empty()) {
        kien dist = -pq.top().first;
        kien u = pq.top().second;
        pq.pop();

        if(dist > d[u]) continue;

        for(auto e : g[u]) {
            auto [v, w] = e;

            kien nd = dist + w;

            if(nd < d[v]) {
                d[v] = nd;
                pq.push({-nd, v});
            }
        }
    }
}

kien calc(vector<kien> d1, vector<kien> d2, kien s, kien t) {
    vector<kien> dt(n + 1, LLONG_MAX);
    dijkstra(dt, t);

    vector<pair<kien,kien>> dist(n + 1, {LLONG_MAX,0});

    priority_queue<pair<pair<kien,kien>, kien>> pq;

    dist[s] = {0, d1[s]};

    pq.push({{0, d1[s]}, s});

    while(!pq.empty()) {

        auto cur = pq.top().first;
        kien u = pq.top().second;
        pq.pop();

        kien w = -cur.first;
        kien mn = cur.second;

        if(make_pair(w,mn) > dist[u]) continue;

        for(auto e : g[u]) {

            kien v = e.first;
            kien cost = e.second;

            kien nw = w + cost;
            kien tpp = min(mn, d1[v]);

            if(nw < dist[v].first or (nw == dist[v].first and tpp < dist[v].second)) {
                dist[v] = {nw, tpp};
                pq.push({{-nw, tpp}, v});

            }
        }
    }

    kien res = d1[cv];

    FOR (i, 1, n) {
        if (dt[i] + dist[i].first == dist[t].first) {
            res = min(res, dist[i].second + d2[i]);
        }
    }

    return res;
}

void solve() {
    cin >> n >> m;
    cin >> s >> t >> cu >> cv;
    kien a, b, c;

    FOR (i, 1, m) {
        cin >> a >> b >> c;
        g[a].pb({b, c});
        g[b].pb({a, c});

    }

    vector<kien> d1(n + 1, LLONG_MAX);
    vector<kien> d2(n + 1, LLONG_MAX);

    dijkstra(d1, cu);
    dijkstra(d2, cv);

    cout << min(calc(d1, d2, s, t), calc(d1, d2, t, s));
}

main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    if (fopen(task".inp", "r")) {
        fin(task); fou(task);
    }

    int t = 1;
    while(t--) solve();

    cerr << "\n" << 1.0 * clock() / CLOCKS_PER_SEC << "s ";
}

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

commuter_pass.cpp:127:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  127 | main() {
      | ^~~~
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:16:23: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 | #define fin(x) freopen(x".inp","r",stdin)
      |                ~~~~~~~^~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:132:9: note: in expansion of macro 'fin'
  132 |         fin(task); fou(task);
      |         ^~~
commuter_pass.cpp:17:23: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 | #define fou(x) freopen(x".out","w",stdout)
      |                ~~~~~~~^~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:132:20: note: in expansion of macro 'fou'
  132 |         fin(task); fou(task);
      |                    ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...