제출 #1151263

#제출 시각아이디문제언어결과실행 시간메모리
1151263turskaCyberland (APIO23_cyberland)C++20
97 / 100
1179 ms17600 KiB
#include "cyberland.h"


#include <bits/stdc++.h>
#include <queue>
using namespace std;
using ll = long long;
const ll INF = 1e18;
vector<vector<array<int, 2>>> adj;


pair<vector<double>, vector<char>> dijkstra(vector<pair<int, double>> starts, int N, int H) {
    vector<double> dist(N, INF);
    vector<char> vis(N);
    priority_queue<pair<double, int>> pq;
    for (auto [v, d]: starts) {
        dist[v] = d;
        pq.push({-d, v});
    }
    while (!pq.empty()) {
        auto [_, v] = pq.top(); pq.pop();
        if (vis[v]) continue;
        vis[v] = true;
        if (v==H) continue;
        for (auto [u, w]: adj[v]) {
            if (dist[v]+w<dist[u]) {
                dist[u] = dist[v]+1.0*w;
                pq.push({-dist[u], u});
            }
        }
    }
    return {dist, vis};
}

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) {
    adj.assign(N, {});
    for (int i=0; i<M; i++) {
        int u = x[i], v=y[i], w=c[i];
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
    }
    double ans = INF; 
    vector<char> vis(N);
    vis[0] = true;
    queue<int> q;
    q.push(0);
    while (!q.empty()) {
        int v= q.front(); q.pop();
        for (auto [u, _]: adj[v]) {
            if (!vis[u] && u!=H) {
                vis[u] = true;
                q.push(u);
            }
        }
    };
    vector<pair<int, double>> starts = {{0, 0}};
    for (int i=1; i<N; i++) if (vis[i] && arr[i]==0) starts.push_back({i, 0});
    K = min(K, 60);
    while (K>=0) {
        vector<double> dist_next(N, INF); 
        auto [dist,vis] = dijkstra(starts, N, H);
        if (!vis[H]) break;
        ans = min(ans, dist[H]);
        for (int v=0; v<N; v++) {
            if (arr[v]!=2 || !vis[v] || v==H) continue;
            for (auto [u, w]: adj[v]) dist_next[u] = min(dist_next[u], dist[v]/2.0+1.0*w);
        }
        starts.clear();
        for (int v=0; v<N; v++) if (vis[v]) starts.push_back({v, dist_next[v]});
        K--;
    }
    if (2*ans>=INF) return -1;
    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...