제출 #839061

#제출 시각아이디문제언어결과실행 시간메모리
839061vjudge1Commuter Pass (JOI18_commuter_pass)C++17
15 / 100
240 ms34728 KiB
#include <bits/stdc++.h>
using namespace std;

#define pii pair<int, int>
#define fi first
#define se second
#define int long long
using ll = long long;

const ll inf = 1e18;
const int N = 1e5+5;

int n, m, s, t, u, v;
ll ds[N], du[N], dv[N], dpv[N], dpu[N], save[N], ans = inf;
bool chk[N];
vector <int> dag[N], tree[N];
vector <pii> g[N];

void dijkstra(int s, ll d[]) {
    priority_queue <pii, vector<pii>, greater<pii>> pq;

    d[s] = 0;
    pq.push(make_pair(d[s], s));
    
    while(pq.size()) {
        pii u = pq.top(); pq.pop();
        if(u.fi > d[u.se]) continue;

        for(pii e:g[u.se]) {
            if(d[e.fi] > d[u.se] + e.se) {
                d[e.fi] = d[u.se] + e.se;
                pq.push(make_pair(d[e.fi], e.fi));
            }
        }
    }
}

void dfs(int u) {
    chk[u] = true;
    for(int v:dag[u]) if(!chk[v]) {
        dfs(v);
        if(save[v]) tree[u].emplace_back(v); 
        save[u] = save[u] | save[v];    
    }
}

void dag_dijkstra() {
    queue <int> q;
    q.push(s);

    while(q.size()) {
        int u = q.front(); q.pop();

        if(chk[u]) continue;
        chk[u] = true;

        for(pii e:g[u]) {
            if(ds[e.fi] == ds[u] + e.se) {
                dag[u].emplace_back(e.fi);
                q.push(e.fi);
            }
        }
    }

    memset(chk, 0, sizeof(chk));
    save[t] = 1;
    dfs(s);
}

void dfs_dp(int u) { 
    ll Minu = inf, Minv = inf;
    for(int v:tree[u]) {
        dfs_dp(v);
        ans = min({ans, du[u] + dpv[v], dv[u] + dpu[v]});
        Minu = min(Minu, dpu[v]);
        Minv = min(Minv, dpv[v]);
    }

    dpu[u] = min(Minu, du[u]); dpv[u] = min(Minv, dv[u]);
}

void dynamic_programming() {
    dfs_dp(s);
    ans = min(ans, du[v]);
    cout << ans;
}

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

    if(fopen("test.inp", "r")) {
        freopen("test.inp", "r", stdin);
        freopen("test.out", "w", stdout);
    }

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

    for(int i = 1, a, b, c; i <= m; ++i) {
        cin >> a >> b >> c;
        g[a].emplace_back(b, c);
        g[b].emplace_back(a, c);
    }
    
    memset(ds, 0x3f, sizeof(ds)); memset(du, 0x3f, sizeof(du)); memset(dv, 0x3f, sizeof(dv));
    memset(dpv, 0x3f, sizeof(dpv)); memset(dpu, 0x3f, sizeof(dpu)); 
    dijkstra(s, ds); dijkstra(u, du), dijkstra(v, dv);

    dag_dijkstra();
    dynamic_programming();
}

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

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:93:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |         freopen("test.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:94:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |         freopen("test.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...