제출 #1274364

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


#include <bits/stdc++.h>
using namespace std;

const int MAXN=100000;
const double INF=1e18;
vector<vector<pair<int,double>>> adj;
bool alc[MAXN];

void dfs(int u){
    alc[u]=true;
    for(auto [v,t]:adj[u]){
        if(!alc[v]){
            dfs(v);
        }
    }
}

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, 80);// log_2(10^18), ten en cuenta el epsilon
    memset(alc, 0, sizeof(alc));
    adj.clear();
    adj.resize(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]});
    }
    dfs(0);
    if(!alc[H])return -1;
    vector<double> dp(N, INF);
    double ans=INF;
    for(int k=0;k<=K;k++){
        priority_queue<pair<double, int>> pq;
        vector<double> ndp(N, INF);
        if(k==0){
            pq.push({0,0});
        }else{
            for(int i=0;i<N;i++){
                if(dp[i]==INF)continue;
                if(arr[i]==2){
                    pq.push({-dp[i]/2,i});
                }else if(arr[i]==0)ndp[i]=0;
            }
        }
        while(!pq.empty()){
            auto [d,u]=pq.top(); pq.pop();
            if(u==H)continue;
            d=-d;
            for(auto [v,t]:adj[u]){
                if(ndp[v]>d+t){
                    if(arr[v]==0)ndp[v]=0;
                    else ndp[v]=d+t;
                    pq.push({-ndp[v],v});
                }
            }
        }   
        ans=min(ans, ndp[H]);
        swap(dp, ndp);
    }
    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...