Submission #1368774

#TimeUsernameProblemLanguageResultExecution timeMemory
1368774KALARRY사이버랜드 (APIO23_cyberland)C++20
100 / 100
1625 ms104180 KiB
//chockolateman

#include<bits/stdc++.h>
// #include "cyberland.h"

using namespace std;

const double INF = 1e15;

int n,T,status[100005];
double dist[100005][105];
bool visited[100005][105];
bool reached[100005];
vector<pair<int,int>> adj[100005];

void dfs(int v)
{
    if(reached[v])
        return;
    reached[v] = true;
    for(auto e : adj[v])
    {
        int u = e.first;
        dfs(u);
    }
}

void Dijkstra()
{
    for(int i = 0 ; i < n ; i++)
        for(int k = 0 ; k <= 100 ; k++)
        {
            dist[i][k] = INF;
            visited[i][k] = false;
        }
    priority_queue<pair<pair<int,double>,int>> q;
    dist[0][0] = 0;
    q.push({{0,0},0});
    for(int v = 1 ; v < n ; v++)
        if(reached[v] && status[v]==0)
        {
            dist[v][0] = 0;
            q.push({{0,0},v});
        }
    for(int k = 0 ; k <= 100 ; k++)
        visited[T][k] = true;
    while(!q.empty())
    {
        int v = q.top().second;
        int k = -q.top().first.first;
        q.pop();
        if(visited[v][k])
            continue;
        visited[v][k] = true;
        for(auto e : adj[v])
        {
            int u = e.first;
            int w = e.second;
            double cur = dist[v][k] + w; 
            if(cur < dist[u][k])
            {
                dist[u][k] = cur;
                q.push({{-k,-dist[u][k]},u});
            }
            if(status[u]==2 && k < 100)
            {
                cur /= 2.00;
                if(cur < dist[u][k+1])
                {
                    dist[u][k+1] = cur;
                    q.push({{-(k+1),-cur},u});
                }
            }
        }  
    }
}

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) {
    n = N;
    T = H;
    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]});
    }
    for(int i = 0 ; i < N ; i++)
        status[i] = arr[i];
    reached[H] = true;
    dfs(0);
    Dijkstra();
    double ret = INF;
    for(int k = 0 ; k <= min(K,100) ; k++)
        ret = min(ret,dist[H][k]);
    if(ret >= INF-5)
        ret = -1;
    for(int i = 0 ; i < N ; i++)
    {
        adj[i].clear();
        reached[i] = false;
    }
    return ret;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...