제출 #1267921

#제출 시각아이디문제언어결과실행 시간메모리
1267921khanhdangiuu사이버랜드 (APIO23_cyberland)C++20
100 / 100
1581 ms125508 KiB
#include "cyberland.h"
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pb push_back
#define pii pair<int, int>
#define pdi pair<double, int>
#define mp make_pair

const int INF = LLONG_MAX;

double solve(int32_t n, int32_t m, int32_t K, int32_t h, vector<int32_t> x, vector<int32_t> y, vector<int32_t> c, vector<int32_t> arr){
    K = min(K, 70);
    vector<vector<pii> > graph(n);
    vector<vector<long double> > dj(n, vector<long double>(K+1, INF));
    priority_queue<pdi, vector<pdi>, greater<pdi> > pq;
    for (int i=0; i<m; ++i){
        graph[x[i]].pb(mp(y[i], c[i]));
        graph[y[i]].pb(mp(x[i], c[i]));
    }
    dj[0][0]=0;
    for (int k=0; k<=K; ++k){
        for (int i=0; i<n; ++i)if (dj[i][k]!=INF)pq.push(mp(dj[i][k], i));
        while (!pq.empty()){
            int cnode = pq.top().second;
            long double dist = pq.top().first;
            pq.pop();
            if (abs(dist-dj[cnode][k])>1e-9 || cnode==h)continue;
            for (auto num:graph[cnode]){
                if (!arr[num.first] && dj[num.first][k]>0){
                    dj[num.first][k]=0;
                    pq.push(mp(0, num.first));
                    continue;
                }
                if (dist+num.second<dj[num.first][k]){
                    dj[num.first][k]=dist+num.second;
                    pq.push(mp(dj[num.first][k], num.first));
                }
                if (arr[cnode]==2 && k<K && dj[num.first][k+1]>dist/2+num.second)
                {
                    dj[num.first][k+1]=dist/2+num.second;
                    pq.push(mp(dist/2+num.second, num.first));
                }
            }
        }
    }
    long double minnum=INF;
    for (int i=0; i<=K; ++i)minnum=min(minnum, dj[h][i]);
    return (minnum==INF?-1:minnum);
}
#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...