제출 #1363866

#제출 시각아이디문제언어결과실행 시간메모리
1363866serendipitous사이버랜드 (APIO23_cyberland)C++20
49 / 100
3099 ms263228 KiB
#include "cyberland.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

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]].emplace_back(y[i], c[i]);
        adj[y[i]].emplace_back(x[i], c[i]);
    }
    
    vector<double> dist(N, DBL_MAX);
    priority_queue<tuple<double, int, int>, vector<tuple<double, int, int>>, greater<tuple<double, int, int>>> dijkstra;
    dijkstra.emplace(0, H, 0);

    arr[0] = -1;
    queue<int> bfs; bfs.push(0);
    vector<bool> visited_0(N);
    while(!bfs.empty()) {
        int u = bfs.front(); bfs.pop();
        if(visited_0[u]) continue;
        visited_0[u] = true;
        if(arr[u] == 0) arr[u] = -1;
        if(u == H) continue; // we can't move from H
        for(auto [v, c]: adj[u]) bfs.push(v);
    }

    double min_dist = DBL_MAX;

    while(!dijkstra.empty()) {
        auto [d, u, k] = dijkstra.top();
        dijkstra.pop();
        if(d >= dist[u]) continue;
        dist[u] = d;
        if(arr[u] == -1) {
            min_dist = min(min_dist, d);
        } else if(arr[u] == 2 && k < K) {
            ++k;
        }
        for(auto [v, cv]: adj[u]) {
            dijkstra.emplace(d + (double)cv/(1 << k), v, k);
        }
    }
    
    if(min_dist == DBL_MAX) return -1;
    return min_dist;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…