Submission #1173709

#TimeUsernameProblemLanguageResultExecution timeMemory
1173709Spade1Cyberland (APIO23_cyberland)C++20
15 / 100
3097 ms29264 KiB
#include "cyberland.h"
#include <bits/stdc++.h>
#define eb emplace_back
#define pii pair<int, int>
#define st first
#define nd second

using namespace std;

const int MX = 1e5 + 3;
const int MXK = 32;

vector<pii> adj[MX];
double dis[MX][MXK];

double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr) {
  for (int i = 0; i < N; ++i) adj[i].clear();
  for (int i = 0; i < M; ++i) adj[x[i]].eb(y[i], c[i]), adj[y[i]].eb(x[i], c[i]);
  for (int i = 0; i < N; ++i) 
    for (int j = 0; j <= K; ++j) 
      dis[i][j] = DBL_MAX / 2; 
  
  priority_queue<pair<double, pii>> pq;
  for (int i = 0; i < N; ++i) 
    if (arr[i] == 0 || i == 0)
      pq.push({dis[i][0] = 0, {i, 0}});
  while (!pq.empty()) {
    auto d = pq.top().st;
    auto [a, k] = pq.top().nd; pq.pop();
    if (d > dis[a][k]) continue;
    for (auto [b, w] : adj[a]) {
      if (d + w < dis[b][k]) pq.push({dis[b][k] = d + w, {b, k}});
      if (arr[b] == 2 && (d + w)/2 < dis[b][k+1]) pq.push({dis[b][k+1] = (d + w)/2, {b, k+1}});
    }
  }
  
  double ans = DBL_MAX;
  for (int j = 0; j <= K; ++j)
    ans = min(ans, dis[H][j]);
  return (ans == DBL_MAX / 2 ? -1 : 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...