# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1273660 | vtnoo | 사이버랜드 (APIO23_cyberland) | C++20 | 0 ms | 0 KiB |
#include "cyberland.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN=100000;
vector<vector<pair<int,double>>> adj;
bool alc[MAXN], vis[MAXN];
void dfs(int u, const int& ban){
alc[u]=true;
for(auto [v,t]:adj[u]){
if(v==ban)continue;
if(!alc[v]){
dfs(v, ban);
}
}
}
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) {
memset(alc, 0, sizeof(alc));
memset(vis, 0, sizeof(vis));
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,H);
set<pair<double,int>> q;
q.insert({0,0});
double op1=1e18, op2=1e18;
while(!q.empty()){
auto [d,u]=*q.begin();
q.erase(q.begin());
vis[u]=true;
if(u==H){
op1=d;
break;
}
for(auto [v,t]:adj[u]){
if(!vis[v]){
q.insert({d+t,v});
}
}
}
set<tuple<double,int,int>> q2;
q2.insert({0,0,H});
vector<vector<double>> dist(N, vector<double>(K+1, 1e18));
dist[H][0]=0;
while(!q2.empty()){
auto [d,k,u]=*q2.begin();
q2.erase(q2.begin());
if(arr[u]==0){
op2=min(op2, d);
continue;
}
for(auto [v,t]:adj[u]){
if(alc[v]){
if(arr[v]==2&&k+1<=K){
if(dist[v][k+1]>(dist[u][k]+t)/2){
dist[v][k+1]=(dist[u][k]+t)/2;
q2.insert({dist[v][k+1],k+1,v});
}
}
if(dist[v][k]>dist[u][k]+t){
dist[v][k]=dist[u][k]+t;
q2.insert({dist[v][k],k,v});
}
}
}
}
if(op1==1e18)return -1;
if(tar==-1){
return *min_element(dist[0].begin(), dist[0].end());
}
return min(*min_element(dist[0].begin(), dist[0].end()), op2);
}