제출 #932219

#제출 시각아이디문제언어결과실행 시간메모리
932219Darren0724Cyberland (APIO23_cyberland)C++17
100 / 100
2623 ms19196 KiB
#include "cyberland.h" #include <bits/stdc++.h> //#include "stub.cpp" using namespace std; #define all(x) x.begin(),x.end() const long long INF=1e18; const double eps=1e-6; double solve(int n, int m, int k, int h, vector<int> x, vector<int> y, vector<int> v, vector<int> c1) { k=min(k,80); vector<pair<int,long long>> adj[n+1]; for(int i=0;i<m;i++){ if(x[i]!=h)adj[x[i]].push_back({y[i],v[i]}); if(y[i]!=h)adj[y[i]].push_back({x[i],v[i]}); } vector vis(n,(int)0); queue<int> q; q.push(0); vis[0]=1; while(q.size()){ int p=q.front(); q.pop(); for(auto [a,b]:adj[p]){ if(!vis[a]){ vis[a]=1; q.push(a); } } } if(!vis[h])return -1; vector dis(n,(long double)INF),dis1(n,(long double)INF); priority_queue<pair<long double ,int>> pq; c1[0]=0; for(int i=0;i<n;i++){ if(c1[i]==0){ dis[i]=0; } } long double ans=INF; for(int i=0;i<=k;i++){ for(int j=0;j<n;j++){ if(vis[j]){ pq.push({-dis[j],j}); } } while(pq.size()){ auto [a,b]=pq.top(); pq.pop(); a=-a; if(a!=dis[b])continue; for(auto [c,d]:adj[b]){ long double cost=a+d; if(cost<dis[c]){ dis[c]=cost; pq.push({-dis[c],c}); } if(c1[c]==2)cost/=2; if(cost<dis1[c]){ dis1[c]=cost; } } } ans=min(ans,dis[h]); dis=dis1; fill(all(dis1),INF); } 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...