제출 #1269792

#제출 시각아이디문제언어결과실행 시간메모리
1269792thanhlhpCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
699 ms74748 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
#define iii pair<int, ii>
#define iiii pair<ii,ii>
#define fi first
#define se second
#define inf 10000000000000000
#define pi M_PI
const int N = 1e5 + 5;
int n, m;
int S, T, X, Y;
vector<ii> g[N];
int dx[3*N], dn[N];
vector<ii> g2[3*N], g3[3*N];
vector<iii> canh;
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    if(fopen("main.inp","r")) {
        freopen("main.inp", "r", stdin);
        freopen("main.out", "w", stdout);
    }
    cin >> n >> m;
    cin >> S >> T >> X >> Y;
    for(int i = 1; i <= m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u].push_back({w,v});
        g[v].push_back({w,u});
        canh.push_back({w,{u,v}});
    }


    priority_queue<ii,vector<ii>,greater<ii>> pq;
    for(int i = 1; i <= n; i++) dx[i] = inf;
    dx[S] = 0;
    pq.push({0,S});
    while(pq.size()) {
        int u = pq.top().se;
        int du = pq.top().fi;
        pq.pop();
        if(du != dx[u]) continue;
        for(auto tmp : g[u]) {
            int v = tmp.se;
            int w = tmp.fi;
            if(dx[v] > dx[u] + w) {
                dx[v] = dx[u] + w;
                pq.push({dx[v],v});
            }
        }
    }

    for(int i = 1; i <= n; i++) dn[i] = inf;
    dn[T] = 0;
    pq.push({0,T});
    while(pq.size()) {
        int u = pq.top().se;
        int du = pq.top().fi;
        pq.pop();
        if(du != dn[u]) continue;
        for(auto tmp : g[u]) {
            int v = tmp.se;
            int w = tmp.fi;
            if(dn[v] > dn[u] + w) {
                dn[v] = dn[u] + w;
                pq.push({dn[v],v});
            }
        }
    }

    for(auto x : canh) {
            int i = x.se.fi;
            int j = x.se.se;
            int w = x.fi;
            if(dx[i] + w + dn[j] == dx[T]) {
            g3[i].push_back({0,j});
            }
            if(dx[j] + w + dn[i] == dx[T]) {
                g3[j].push_back({0,i});
            }


    }

    for(auto tmp : canh) {
            int i = tmp.se.fi;
            int j = tmp.se.se;
            int w = tmp.fi;
            g3[i+n].push_back({w,j+n});
            g3[j+n].push_back({w,i+n});
            g3[i+2*n].push_back({w,j+2*n});
            g3[j+2*n].push_back({w,i+2*n});
            g3[i+n].push_back({0,i});
            g3[j+n].push_back({0,j});
            g3[i].push_back({0,i+2*n});
            g3[j].push_back({0,j+2*n});
    }
    for(int i = 1; i <= 3*n; i++) dx[i] = inf;
    dx[Y+n] = 0;
    pq.push({0,Y+n});
    while(pq.size()) {
        int u = pq.top().se;
        int du = pq.top().fi;
        pq.pop();
        if(du != dx[u]) continue;
        for(auto tmp : g3[u]) {
            int v = tmp.se;
            int w = tmp.fi;
            if(dx[v] > dx[u] + w) {
                dx[v] = dx[u] + w;
                pq.push({dx[v],v});
            }
        }
    }
    int ans = dx[X+2*n];
    for(int i = 1; i <= 3*n; i++) dx[i] = inf;
    dx[X+n] = 0;
    pq.push({0,X+n});
    while(pq.size()) {
        int u = pq.top().se;
        int du = pq.top().fi;
        pq.pop();
        if(du != dx[u]) continue;
        for(auto tmp : g3[u]) {
            int v = tmp.se;
            int w = tmp.fi;
            if(dx[v] > dx[u] + w) {
                dx[v] = dx[u] + w;
                pq.push({dx[v],v});
            }
        }
    }
    ans = min(ans,dx[Y+2*n]);
    cout << ans;
    return 0;
}

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

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:23:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |         freopen("main.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:24:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 |         freopen("main.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...