제출 #1348660

#제출 시각아이디문제언어결과실행 시간메모리
1348660jadai007사이버랜드 (APIO23_cyberland)C++20
44 / 100
3092 ms29540 KiB
#include "cyberland.h"
#include <bits/stdc++.h>

using namespace std;

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) {
    const double inf = 1e18;
    K = min(K, 80);
    vector<vector<double>> dis(N + 1, vector<double>(K + 1, inf));
    vector<vector<pair<int, double>>> adj(N + 1);
    vector<int> vis(N);
    queue<int> q;
    priority_queue<tuple<double, int, int>, vector<tuple<double, int, int>>, greater<tuple<double, int, int>>> pq;
    for(int i = 0; i < M; ++i){
        adj[x[i]].emplace_back(y[i], (double)(c[i]));
        adj[y[i]].emplace_back(x[i], (double)(c[i]));
    }
    q.push(0);
    vis[0] = 1;
    while(!q.empty()){
        int u = q.front(); q.pop();
        if(u == H) continue;
        for(auto [v, w]:adj[u]) if(!vis[v]) vis[v] = 1, q.push(v);
    }
    dis[0][0] = 0.0;
    pq.emplace(0.0, 0, 0);
    for(int i = 1; i < N; ++i) if(vis[i] && arr[i] == 0) fill(dis[i].begin(), dis[i].end(), 0), pq.emplace(0.0, i, 0);
    while(!pq.empty()){
        auto [w, u, k] = pq.top();
        pq.pop();
        if(dis[u][k] < w) continue;
        for(auto [v, ww]:adj[u]){
            if(dis[v][k] > dis[u][k] + ww){
                dis[v][k] = dis[u][k] + ww;
                pq.emplace(dis[v][k], v, k);
            }
            if(arr[v] == 2 && k < K){
                if(dis[v][k + 1] > (dis[u][k] + ww) / 2.0){
                    dis[v][k + 1] = (dis[u][k] + ww) / 2;
                    pq.emplace(dis[v][k + 1], v, k + 1);
                }
            }
        }
    }
    double ans = *min_element(dis[H].begin(), dis[H].begin() + 1 + K);
    if(ans == inf) return -1;
    else return ans;
}
#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...