제출 #1358255

#제출 시각아이디문제언어결과실행 시간메모리
1358255Zone_zonee사이버랜드 (APIO23_cyberland)C++20
40 / 100
193 ms20752 KiB
#include <bits/stdc++.h>
using namespace std;
#include "cyberland.h"
const int MxN = 1e5+10;

double dist[32][MxN];
vector<pair<int, double>> adj[MxN];
struct state_t{
    double d;
    int u, s;
    bool operator<(const state_t& o) const{
        return d > o.d;
    }
};

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) {
    for(int i = 0; i <= K; ++i) for(int j = 0; j <= N; ++j) dist[i][j] = 1e18;
    for(int i = 0; i < N; ++i) adj[i].clear();
    for(int i = 0; i < M; ++i){
        adj[x[i]].push_back({y[i], 1.0*c[i]});
        adj[y[i]].push_back({x[i], 1.0*c[i]});
    }
    priority_queue<state_t> pq;
    pq.push({dist[0][0] = 0, 0, 0});
    while(!pq.empty()){
        state_t cur = pq.top(); pq.pop();
        if(dist[cur.s][cur.u] < cur.d) continue;
        if(cur.u == H) continue;
        for(auto [v, w] : adj[cur.u]){
            if(arr[v] == 0){
                if(dist[0][v] > 0) pq.push({dist[0][v] = 0, v, 0});
            }else if(arr[v] == 2 && cur.s < K){
                if(dist[cur.s+1][v] > (w+cur.d)/2) pq.push({dist[cur.s+1][v] = (w+cur.d)/2, v, cur.s+1});
            }
            if(dist[cur.s][v] > w+cur.d) pq.push({dist[cur.s][v] = w+cur.d, v, cur.s});
        }
    }
    double ans = 1e18;
    for(int i = 0; i <= K; ++i) ans = min(ans, dist[i][H]);
    return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…