#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |