Untitled

 avatar
unknown
c_cpp
5 months ago
1.3 kB
2
Indexable
const int MAXI = INT_MAX/2;
int dijkstra(vector<vector<pair<int, int>>>& adj, int n, int d) {
    vector<vector<int>> dis(n, vector<int>(d+1, MAXI));

    set<pair<int, pair<int, int>>> st;
    st.insert({0, {0, 0}});
    dis[0][0] = 0;

    while(!st.empty()) {
        pair<int, pair<int, int>> p = *(st.begin());
        int u = p.second.first, currCoupons = p.second.second;
        int currDis = p.first;

        for(pair<int, int> p : adj[u]) {
            int v = p.second, toll = p.first;

            // take coupon
            if(currCoupons + 1 <= d) {
                if(dis[v][currCoupons+1] > currDis + (toll/2)) {
                    st.erase({dis[v][currCoupons+1], {v, currCoupons+1}});
                    dis[v][currCoupons+1] = currDis + (toll/2);
                    st.insert({dis[v][currCoupons+1], {v, currCoupons+1}});
                }
            }

            // don't take coupon
            if(dis[v][currCoupons] > currDis + toll) {
                st.erase({dis[v][currCoupons], {v, currCoupons}});
                dis[v][currCoupons] = currDis + toll;
                st.insert({dis[v][currCoupons], {v, currCoupons}});
            }
        }
    }

    int ans = MAXI;
    for(int i=0; i<=d; i++) {
        ans = min(ans, dis[n-1][d]);
    }
    return ans;
}
Editor is loading...
Leave a Comment