제출 #1359207

#제출 시각아이디문제언어결과실행 시간메모리
1359207thesenCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
293 ms60844 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define vll vector<ll>
#define vbool vector<bool>
#define pairll pair<ll, ll>
#define pb push_back
#define fi first
#define sc second

void dfs(vector<vll> &path, vector<vll> &w, vll &dist, vbool &vis, vbool &used, ll x, ll tar){
    vis[x] = 1;
    if(tar == x){
        used[x] = 1;
        return;
    }
    for(ll i = 0; i < path[x].size(); i++){
        ll nx = path[x][i];
        ll wei = w[x][i];

        if(!vis[nx]){
            dfs(path, w, dist, vis, used, nx, tar);
        }

        if(!used[nx])continue;
        if(dist[nx] == dist[x] + wei){
            used[x] = 1;
            w[x][i] = 0;
        }
    }
}

ll find_res(ll n, ll s, ll t, ll u, ll v, vector<vll> path, vector<vll> w){

    // do djikstra t -> u
    vll dist(n+1, 1e18);
    dist[t] = 1;
    priority_queue<pairll, vector<pairll>, greater<pairll>> pq, temp;
    pq.push({0, t});

    while(pq.size()){
        ll x, d;
        tie(d, x) = pq.top();
        pq.pop();

        if(dist[x] < d)continue;

        for(ll i = 0; i < path[x].size(); i++){
            ll nx = path[x][i];
            ll wei = w[x][i];

            if(dist[nx] <= d + wei)continue;
            dist[nx] = d+wei;
            pq.push({dist[nx], nx});
        }
    }

    
    vbool vis(n+1), used(n+1);
    dfs(path, w, dist, vis, used, t, s);
    

    // do djikstra with new wei, frm u and v

    ll res = 1e18;

    vll dist_u(n+1, 1e18);
    dist[u] = 0;
    pq.push({0, u});
    while(pq.size()){
        ll x, d;
        tie(d, x) = pq.top();
        pq.pop();

        if(dist_u[x] < d)continue;
        if(x == v){
            res = min(res, dist_u[v]); break;
        }

        for(ll i = 0; i < path[x].size(); i++){
            ll nx = path[x][i];
            ll wei = w[x][i];

            if(dist_u[nx] <= d + wei)continue;
            dist_u[nx] = d+wei;
            pq.push({dist_u[nx], nx});
        }
    }

    swap(pq, temp);

    vll dist_v(n+1, 1e18);
    dist[v] = 0;
    pq.push({0, v});
    while(pq.size()){
        ll x, d;
        tie(d, x) = pq.top();
        pq.pop();

        if(dist_v[x] < d)continue;
        if(x == u){
            res = min(res, dist_v[u]); break;
        }

        for(ll i = 0; i < path[x].size(); i++){
            ll nx = path[x][i];
            ll wei = w[x][i];

            if(dist_v[nx] <= d + wei)continue;
            dist_v[nx] = d+wei;
            pq.push({dist_v[nx], nx});
        }
    }

    return res;




}

void solve(){
    ll n, m; cin >> n >> m;
    ll s, t; cin >> s >> t;
    ll u, v; cin >> u >> v;

    vector<vll> path(n+1), w(n+1);
    while(m--){
        ll a, b, c; cin >> a >> b >> c;
        path[a].pb(b);
        path[b].pb(a);
        w[a].pb(c);
        w[b].pb(c);
    }

    cout << min(find_res(n, s, t, u, v, path, w), find_res(n, t, s, u, v, path, w)) << endl;
}

int main(){
    ll t = 1; //cin >> t;
    while(t--)solve();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…