Submission #1286739

#TimeUsernameProblemLanguageResultExecution timeMemory
1286739harryleeeCommuter Pass (JOI18_commuter_pass)C++20
15 / 100
2096 ms34112 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e5;
int n, m, st, en, shop1, shop2;
struct line{
    int u, v, w, id;
};
line l[2 * maxn + 1];
vector<line> adj[maxn + 1];
bool on_road[2 * maxn + 1];
vector<long long> dis_st, dis_en, dis_shop1, dis_shop2;

struct str{
    bool operator ()(const pair<int, long long>& x, const pair<int, long long>& y) const {
        return x.second > y.second;
    }
};

inline vector<long long> dijkstra(int st){
    vector<long long> ans(n + 1 , 1e18);
    ans[st] = 0;
    priority_queue<pair<int, long long>, vector<pair<int, long long>>, str> pq;
    pq.push({st, 0});
    while(!pq.empty()){
        int u = pq.top().first, dis = pq.top().second;
        pq.pop();
        if (dis > ans[u]) continue;
        for (line l : adj[u]){
            int nxt = (u == l.u) ? l.v : l.u;
            int w = l.w;
            if (dis + w < ans[nxt]){
                ans[nxt] = dis + w;
                pq.push({nxt, ans[nxt]});
            } 
        }
    }
    return ans;
}

inline long long solve(){
    long long res = dis_shop1[shop2];
    priority_queue<pair<int, long long>, vector<pair<int, long long>>, str> pq;
    pq.push({st, dis_shop1[st]});
    while(!pq.empty()){
        int u = pq.top().first;
        long long dis = pq.top().second;
        pq.pop();
        dis = min(dis, dis_shop1[u]);
        res = min(res, dis + dis_shop2[u]);
        for (line ln : adj[u]) if (on_road[ln.id]){
            int nxt = (u == ln.u) ? ln.v : ln.u;
            if (dis_st[u] + ln.w != dis_st[nxt]) continue;
            pq.push({nxt, dis});
        }
    }
    return res;
}
inline long long solve1(){
    long long res = dis_shop1[shop2];
    priority_queue<pair<int, long long>, vector<pair<int, long long>>, str> pq;
    pq.push({st, dis_shop2[st]});
    while(!pq.empty()){
        int u = pq.top().first;
        long long dis = pq.top().second;
        pq.pop();
        dis = min(dis, dis_shop2[u]);
        res = min(res, dis + dis_shop1[u]);
        for (line ln : adj[u]) if (on_road[ln.id]){
            int nxt = (u == ln.u) ? ln.v : ln.u;
            if (dis_st[u] + ln.w != dis_st[nxt]) continue;
            pq.push({nxt, dis});
        }
    }
    return res;
}
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m >> st >> en >> shop1 >> shop2;
    for (int i = 1; i <= m; ++i){
        cin >> l[i].u >> l[i].v >> l[i].w;
        l[i].id = i;
        adj[l[i].u].push_back(l[i]);
        adj[l[i].v].push_back(l[i]);
    }

    dis_st = dijkstra(st);
    dis_en = dijkstra(en);
    dis_shop1 = dijkstra(shop1);
    dis_shop2 = dijkstra(shop2);

    for (int i = 1; i <= m; ++i){
        int u = l[i].u, v = l[i].v, w = l[i].w;
        if (dis_st[u] + dis_en[v] + w == dis_st[en] || dis_st[v] + dis_en[u] + w == dis_st[en])
            on_road[l[i].id] = true;
    }

    cout << min(solve(), solve1());
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...