제출 #1228158

#제출 시각아이디문제언어결과실행 시간메모리
1228158pera사이버랜드 (APIO23_cyberland)C++20
97 / 100
3098 ms160684 KiB
#include "cyberland.h"
#include <bits/stdc++.h>
#define LL double
using namespace std;
const int N = 1E5 + 1 , KM = 75;
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>>> g(N);
   for(int i = 0;i < M;i ++){
      g[x[i]].emplace_back(y[i] , c[i]);
      g[y[i]].emplace_back(x[i] , c[i]);
   }
   vector<bool> vis(N);
   vis[0] = true;
   function<void(int)> dfs = [&](int u){
      if(u == H){
         return;
      }
      for(auto [v , w] : g[u]){
         if(!vis[v]){
            vis[v] = true;
            dfs(v);
         }
      }
   };
   dfs(0);
   K = min(K , 74);
   vector<vector<LL>> dist(N , vector<LL>(K + 1 , -1));
   priority_queue<tuple<LL , int , int> , vector<tuple<LL , int , int>> , greater<tuple<LL , int , int>>> pq;
   LL ans = -1;
   for(int i = 0;i < N;i ++){
      if(vis[i] && (i == 0 || arr[i] == 0)){
         pq.push({0 , i , 0});
         dist[i][0] = 0;
      }
   }
   while(!pq.empty()){
      auto [D , u , x] = pq.top();
      pq.pop();
      if(dist[u][x] != D){
         continue;
      }
      if(u == H){
         if(ans == -1){
            ans = D;
         }else{
            ans = min(ans , D);
         }
         continue;
      }
      for(auto [v , w] : g[u]){
         LL nD = D + (LL)w;
         if(dist[v][x] == -1 || dist[v][x] > nD){
            dist[v][x] = nD;
            pq.push({dist[v][x] , v , x});
         }
         nD /= 2.0;
         if(arr[v] == 2 && x < K && (dist[v][x + 1] == -1 || dist[v][x + 1] > nD)){
            dist[v][x + 1] = nD;
            pq.push({dist[v][x + 1], v , x + 1});
         }
      }
   }
   return (double)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...