제출 #1158328

#제출 시각아이디문제언어결과실행 시간메모리
1158328countless사이버랜드 (APIO23_cyberland)C++20
8 / 100
19 ms5700 KiB
#include "cyberland.h"

#include <vector>
#include <queue>

using namespace std;

typedef long long ll;

const ll INF = 1e18;


// Dijkstra's algorithm from USACO guide
double solve(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr) {
    vector<vector<pair<int, int>>> adj(N);
    for (int i = 0; i < M; i++) {
        adj[x[i]].push_back({y[i], c[i]});
        adj[y[i]].push_back({x[i], c[i]});
    }

    
    using T = pair<ll, int>;
    vector<bool> visited(N, false);
    vector<ll> dist(N, INF);
    dist[0] = 0;
    priority_queue<T, vector<T>, greater<T>> pq;
    pq.push({0, 0});

    while (!pq.empty()) {
        const auto [cdist, node] = pq.top();
        pq.pop();

        if (visited[node]) continue;
        if (cdist != dist[node]) continue;
        for (const pair<int, int> &i : adj[node]) {
            // if (visited[i.first]) continue;

            if (arr[i.first] == 0) {
                pq.push({dist[i.first] = 0, i.first});
                visited[i.first] = true;
                continue;
            }

            if (cdist + i.second < dist[i.first]) {
                pq.push({dist[i.first] = cdist + i.second, i.first});
            }
        }
    }

    return dist[H];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...