제출 #1289126

#제출 시각아이디문제언어결과실행 시간메모리
1289126harryleeeCrocodile's Underground City (IOI11_crocodile)C++20
0 / 100
0 ms332 KiB
#include<bits/stdc++.h>
using namespace std;
const long long inf = 1e18;

struct cmp{
    bool operator()(const pair<long long, long long>& a, const pair<long long, long long>& b) const {
        return a.second > b.second;
    }
};

long long travel_plan(int n, int m, int R[][2], int L[], int k, int P[]){
    vector<vector<pair<long long, long long>>> adj(n);
    vector<pair<long long, long long>> dis(n);

    for (int i = 0; i < n; ++i) dis[i].first = dis[i].second = inf;

    for (int i = 0; i < m; ++i){
        long long u = R[i][0], v = R[i][1], w = L[i];
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
    }

    priority_queue<pair<long long, long long>, vector<pair<long long, long long>>, greater<pair<long long, long long>>> pq;
    for (int i = 0; i < k; ++i){
        int u = P[i];
        dis[u].first = dis[u].second = 0;
        pq.push({0, u});
    }    

    while(!pq.empty()){
        long long u = pq.top().first;
        long long cur_dis = pq.top().second;
        pq.pop();
        if (cur_dis != dis[u].second) continue;
        for (auto [v, w] : adj[u]){
            if (cur_dis + w < dis[v].first){
                dis[v].second = dis[v].first;
                dis[v].first = cur_dis + w;
                if (dis[v].first != inf && dis[v].second != inf)
                    pq.push({dis[v].second, v});
            }
            else if (cur_dis + w < dis[v].second){
                dis[v].second = cur_dis + w;
                if (dis[v].first != inf && dis[v].second != inf)
                    pq.push({dis[v].second, v});
            }
        }
    }

    return dis[0].second;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...