제출 #1159648

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

#include <vector>
#include <queue>
#include <iostream>
#include <math.h>
#include <tuple>

using namespace std;

typedef long long ll;
typedef long double ld;

const ld INF = 9e18;

struct T {
    ld cdist;
    ll k;
    ll node;

    bool operator>(const T &other) const {
        return cdist > other.cdist;
    }
};

void checkReal(int start, int H, vector<vector<pair<ll, ll>>> &adj, vector<bool> &real) {
    real[start] = true;

    if (start == H) return;

    for (const pair<ll, ll> &i : adj[start]) {
        if (!real[i.first]) {
            checkReal(i.first, H, adj, real);
        }
    }
}

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) {
    K = min(K, 99);
    vector<vector<pair<ll, ll>>> adj(N+5);

    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]});
    }

    vector<bool> real(N+5, false);
    checkReal(0, H, adj, real);

    if (!real[H]) return -1;
    real[H] = false;

    vector<vector<ld>> dist(N+5, vector<ld>(K + 1 + 5, INF));
    dist[H][0] = 0;
    priority_queue<T, vector<T>, greater<T>> pq;
    pq.push({0.0, 0, H});

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

        if (arr[node] == 0 || node == 0) {
            return cdist;
        }

        for (const pair<ll, ll> &i : adj[node]) {
            if (i.first == H) continue;
            if (!real[i.first]) continue;

            ld ndist1 = cdist + ((ld)i.second / (ld)pow(2.0, (ld)k));
            if (ndist1 < dist[i.first][k]) {
                dist[i.first][k] = ndist1;
                pq.push({dist[i.first][k], k, i.first});
            }
            
            if (arr[node] == 2 && k < K) {
                ld ndist2 = cdist + ((ld)i.second / (ld)pow(2.0, (ld)k + 1));
                if (ndist2 < dist[i.first][k+1]) {
                    dist[i.first][k+1] = ndist2;
                    pq.push({dist[i.first][k+1], k + 1, i.first});
                }
            }
        }
    }

    return -1;
}
#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...