제출 #1350708

#제출 시각아이디문제언어결과실행 시간메모리
1350708guardianecCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
177 ms24944 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;

void dijkstra(ll s, ll n, vector<vector<pair<ll,ll>>>& adj, vector<ll>& dist) {
    dist.assign(n, 1e18);
    dist[s] = 0;
    priority_queue<pair<ll,ll>, vector<pair<ll,ll>>, greater<pair<ll,ll>>> pq;
    pq.push({0, s});
    
    while(!pq.empty()) {
        auto [d,u] = pq.top();
        pq.pop();
        if (d>dist[u]) continue;
        for (auto [v,w] : adj[u]) {
            if (dist[v]>dist[u]+w) {
                dist[v] = dist[u]+w;
                pq.push({dist[v], v});
            }
        }
    }
}

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

    ll n,m;
    cin >> n >> m;
    ll s,t,u1,v1;
    cin >> s >> t >> u1 >> v1;
    s--; t--; u1--; v1--;
    vector<vector<pair<ll,ll>>> adj(n);
    for (int i=0; i<m; i++) {
        ll u,v,c;
        cin >> u >> v >> c;
        u--; v--;
        adj[u].push_back({v,c});
        adj[v].push_back({u,c});
    }

    vector<ll> dists, distt, distu, distv;
    dijkstra(s, n, adj, dists);
    dijkstra(t, n, adj, distt);
    dijkstra(u1, n, adj, distu);
    dijkstra(v1, n, adj, distv);
    
    vector<vector<ll>> adj1(n);
    vector<ll> deg(n);
    for (int u=0; u<n; u++) {
        for (auto [v,w] : adj[u]) {
            if (dists[u]+w+distt[v]==dists[t]) {
                adj1[u].push_back(v);
                deg[v]++;
            }
        }
    }
    
    vector<ll> topo;
    queue<ll> q;
    for (int i=0; i<n; i++) {
        if (deg[i]==0) q.push(i);
    }
    while(!q.empty()) {
        ll u = q.front();
        q.pop();
        topo.push_back(u);
        for (auto v : adj1[u]) {
            if (--deg[v]==0) q.push(v);
        }
    }
    
    vector<ll> dp1 = distu, dp2 = distv;
    ll res = distu[v1];
    
    for (auto u : topo) {
        for (auto v : adj1[u]) {
            dp1[v] = min(dp1[v], dp1[u]);
            dp2[v] = min(dp2[v], dp2[u]);
        }
    }
    
    for (int i=0; i<n; i++) {
        if (dists[i]+distt[i]==dists[t]) {
            res = min({res, dp1[i]+distv[i], dp2[i]+distu[i]});
        }
    }
    
    cout << res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...