제출 #130536

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

#define long long long
#define pii pair<long, long>
#define x first
#define y second

using namespace std;

const int N = 1e5+5;

vector<pii> g[N];

void sssp(int src, long d[]) {
    fill_n(d, N, 1e18);
    priority_queue<pii, vector<pii>, greater<pii> > Q;

    Q.emplace(d[src] = 0, src);
    while(!Q.empty()) {
        pii now = Q.top(); Q.pop();
        if(d[now.y] != now.x) continue;
        long u, w; tie(w, u) = now;
        for(pii v : g[u]) if(w + v.y < d[v.x])
            Q.emplace(d[v.x] = w + v.y, v.x);
    }
}

int n, m, s, t, u, v;
long ds[N], dt[N], du[N], dv[N];

long solve(int a, int b, long da[], long db[]) {
    long dp[N], len = da[b];
    bool vis[N]; memset(vis, 0, sizeof vis);
    priority_queue<pii, vector<pii>, greater<pii> > Q;
    for(int i = 1; i <= n; i++) dp[i] = du[i];

    Q.emplace(0, a), vis[a] = true;
    while(!Q.empty()) {
        pii now = Q.top(); Q.pop();
        if(now.x != da[now.y]) continue;
        long u, w; tie(w, u) = now;
        for(pii v : g[u]) if(w + v.y + db[v.x] == len) {
            dp[v.x] = min(dp[v.x], dp[u]);
            if(!vis[v.x]) vis[v.x] = true, Q.emplace(w + v.y, v.x);
        }
    }
    long ret = 1e18;
    for(int i = 1; i <= n; i++) if(da[i] + db[i] == len)
        ret = min(ret, dp[i] + dv[i]);
    return ret;
}

int main() {
    scanf("%d %d %d %d %d %d", &n, &m, &s, &t, &u, &v);
    for(int i = 1, a, b, c; i <= m; i++) {
        scanf("%d %d %d", &a, &b, &c);
        g[a].emplace_back(b, c);
        g[b].emplace_back(a, c);
    }
    sssp(s, ds), sssp(t, dt); 
    sssp(u, du), sssp(v, dv); 

    printf("%lld\n", min({du[v], solve(s, t, ds, dt), solve(t, s, dt, ds)}));

    return 0;
}

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

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:54:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d %d %d %d", &n, &m, &s, &t, &u, &v);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:56:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d", &a, &b, &c);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...