Submission #1253238

#TimeUsernameProblemLanguageResultExecution timeMemory
1253238ducanh0811Commuter Pass (JOI18_commuter_pass)C++20
0 / 100
260 ms32888 KiB
#include <bits/stdc++.h>
#define int long long
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i)
#define REV(i, a, b) for (int i = (a), _b = (b); i >= _b; --i)
using namespace std;

int n, m;
#define MAXN 200005
int S, T, U, V;
vector<pair<int, int>> g[MAXN], adj[MAXN];
int d[MAXN][2];
int dist[MAXN];
bool vi[MAXN];
int res = 1e15;

struct edge {
    int u, v, w;
};
vector<edge> edges;

void dijkstra(int s, int id){
    memset(vi, false, sizeof vi);
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push(make_pair(0, s));
    d[s][id] = 0;
    while (pq.size()){
        int w, u; tie(w, u) = pq.top();
        pq.pop();
        if (vi[u]) continue;
        vi[u] = 1;
        for (pair<int, int> &x : g[u]){
            int v, ww; tie(v, ww) = x;
            if (d[v][id] > w + ww){
                d[v][id] = w + ww;
                pq.push(make_pair(d[v][id], v));
            }
        }
    }
}

void process(int s, int e){
    memset(vi, false, sizeof vi);
    memset(dist, 0x3f, sizeof dist);
    dist[s] = 0;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push(make_pair(0, s));
    while (pq.size()){
        int w, u; tie(w, u) = pq.top();
        pq.pop();
        if (vi[u]) continue;
        vi[u] = 1;
        for (pair<int, int> &x : adj[u]){
            int v, ww; tie(v, ww) = x;
            if (dist[v] > w + ww){
                dist[v] = w + ww;
                pq.push(make_pair(dist[v], v));
            }
        }
        for (pair<int, int> &x : g[u]){
            int v, ww; tie(v, ww) = x;
            if (dist[v] > w + ww){
                dist[v] = w + ww;
                pq.push(make_pair(dist[v], v));
            }
        }
    }
    res = min(res, dist[e]);
}

void solve(){
    memset(d, 0x3f, sizeof d);
    cin >> n >> m >> S >> T >> U >> V;
    FOR(i, 1, m){
        int u, v, w; cin >> u >> v >> w;
        g[u].push_back(make_pair(v, w));
        g[v].push_back(make_pair(u, w));
        edges.push_back({u, v, w});
    }
    dijkstra(S, 0);
    dijkstra(T, 1);
    int ST = d[T][0];
    for (edge &x : edges) {
        if (d[x.u][0] + x.w + d[x.v][1] == ST) adj[x.u].push_back(make_pair(x.v, 0));
    }
    process(U, V);
    process(V, U);
    FOR(i, 1, n) adj[i].clear();
    for (edge &x : edges) {
        if (d[x.v][0] + x.w + d[x.u][1] == ST) adj[x.v].push_back(make_pair(x.u, 0));
    }
    process(U, V);
    process(V, U);
    cout << res;
}

/**
6 6
1 6
3 4
1 2 1
2 3 1
3 5 1
2 4 1
4 5 1
5 6 1
**/

#define task "PATH"
int32_t main(){
    if (fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
        freopen(task".out","w",stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    solve();
    return 0;
}

Compilation message (stderr)

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