# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
749944 | jamezzz | 사이버랜드 (APIO23_cyberland) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "cyberland_apio23.h"
#include <bits/stdc++.h>
using namespace std;
#define sf scanf
#define pf printf
#define fi first
#define se second
#define pb push_back
#define EPS 1e-9
#define INF 1023456789
#define LINF 1023456789123456789
#define sz(x) ((int)x.size())
#define all(x) x.begin(),x.end()
#define disc(x) x.resize(unique(all(x))-x.begin())
typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> ii;
typedef tuple<int,int,int> iii;
typedef vector<ii> vii;
typedef pair<double,int> di;
typedef tuple<double,int,int> dii;
#define maxn 100005
#define maxk 75
double dist[maxn][maxk];
vector<ii> AL[maxn];
double solve(int N,int M,int K,int H,vi x,vi y,vi c,vi arr){
K=min(K,70);
priority_queue<di,vector<di>,greater<di>> pq;
for(int i=0;i<N;++i){
for(int j=0;j<=K;++j)dist[i][j]=LINF;
AL[i].clear();
}
dist[0][0]=0;
for(int i=0;i<M;++i){
AL[x[i]].pb({y[i],c[i]});
AL[y[i]].pb({x[i],c[i]});
}
for(int k=0;k<=K;++k){
for(int i=0;i<N;++i){
if(dist[i][k]!=LINF)pq.push({dist[i][k],i});
}
while(!pq.empty()){
auto[d,u]=pq.top();pq.pop();
if(abs(dist[u][k]-d)>EPS||u==H)continue;
for(auto[v,w]:AL[u]){
if(arr[v]==0&&dist[v][k]>0){
dist[v][k]=0;
pq.push({0,v});
continue;
}
if(arr[u]==2&&k<K&&dist[v][k+1]>d/2+w){
dist[v][k+1]=min(dist[v][k+1],d/2+w);
}
if(dist[v][k]>d+w){
dist[v][k]=d+w;
pq.push({dist[v][k],v});
}
}
}
}
double ans=LINF;
for(int i=0;i<=K;++i)ans=min(ans,dist[H][i]);
return ans==LINF?-1:ans;
}