제출 #1327435

#제출 시각아이디문제언어결과실행 시간메모리
1327435spetrCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
494 ms27656 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
const ll mmod = 998244353;  
#define vl vector<long long>
#define vll vector<vector<long long>>
#define pl pair<long long, long long>
#define vb vector<bool>

vector<vector<pl>> graf;
vl dis1, dis2;

void dijkstra(ll v, vl& dis){
    ll n = dis.size();
    priority_queue<pl> q ;
    q.push({0, v});
    vb vis (n, false);

    while (!q.empty()){
        pl prvek = q.top();
        q.pop();
        ll d, pos;
        d = -prvek.first; pos = prvek.second;
        if (vis[pos] == false){
            vis[pos] = true;
            dis[pos] = min(dis[pos], d);
            for (auto x : graf[pos]){
                q.push({-d - x.second, x.first});
            }
        }
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    ll n, m, s, t, u, v;
    cin >>n >> m >> s >>t >> u >> v;
    s--; t--; u--; v--;

    graf.resize(n);
    for (ll i = 0; i < m; i++){
        ll a,b,c;
        cin >>a >>b >>c;
        a--; b--;
        graf[a].push_back({b,c});
        graf[b].push_back({a,c});
    }

    dis1.resize(n, 2e18); dis2.resize(n, 2e18);

    dijkstra(u, dis1);
    dijkstra(v, dis2);

    vl total, mini;

    total.resize(n, 2e18), mini.resize(n, 2e18);
    priority_queue<vl> q;
    q.push({0,s,-1}); //dist, current, parent;
    vb vis(n, false);
    vl dist(n, 2e18);
    while (!q.empty()){
        auto prvek = q.top();
        q.pop();
        ll dis, v, prev;
        dis = -prvek[0];
        v = prvek[1];
        prev = prvek[2];
        if (dis <= dist[v]){
            dist[v] = dis;
            if (prev != -1){
                total[v] = min(total[v], total[prev]);
                mini[v] = min(mini[v], mini[prev]);

            }
            mini[v] = min(mini[v], dis1[v]);
            total[v] = min(total[v], mini[v] + dis2[v]);
        }
        if (vis[v] == false){
            vis[v] = true;
            for (auto x : graf[v]){
                q.push({-dis - x.second, x.first, v});
            }
        }
    }
    ll ans1 = total[t];

    mini.clear();total.clear();
    total.resize(n, 2e18), mini.resize(n, 2e18);

    q.push({0,t,-1}); //dist, current, parent;
    vis.clear();
    vis.resize(n, false);
    dist.clear(); dist.resize(n, 2e18);
    while (!q.empty()){
        auto prvek = q.top();
        q.pop();
        ll dis, v, prev;
        dis = -prvek[0];
        v = prvek[1];
        prev = prvek[2];
        if (dis <= dist[v]){
            dist[v] = dis;
            if (prev != -1){
                total[v] = min(total[v], total[prev]);
                mini[v] = min(mini[v], mini[prev]);

            }
            mini[v] = min(mini[v], dis1[v]);
            total[v] = min(total[v], mini[v] + dis2[v]);
        }

        if (vis[v] == false){
            vis[v] = true;
            for (auto x : graf[v]){
                q.push({-dis - x.second, x.first, v});
            }
        }
    }


    ll ans2 = total[s];
    cout << min(dis2[u], min(ans1, ans2)) <<"\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...