Submission #1192018

#TimeUsernameProblemLanguageResultExecution timeMemory
1192018KhoaDuyCyberland (APIO23_cyberland)C++17
100 / 100
783 ms64580 KiB
#include "cyberland.h"
#include <bits/stdc++.h>
using namespace std;
double solve(int n,int m,int k,int h,vector<int> x,vector<int> y,vector<int> c,vector<int> a){
    k=min(k,70);
    vector<vector<pair<int,int>>> graph(n);
    for(int i=0;i<m;i++){
        graph[x[i]].push_back({y[i],c[i]});
        graph[y[i]].push_back({x[i],c[i]});
    }
    bool del[n];
    for(int i=0;i<n;i++){
        del[i]=true;
    }
    queue<int> q;
    q.push(0);
    del[0]=false;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(pair<int,int> &x:graph[u]){
            int v=x.first;
            if(v!=h&&del[v]){
                del[v]=false;
                q.push(v);
            }
        }
    }
    double DP[k+1][n];
    for(int i=0;i<=k;i++){
        for(int j=0;j<n;j++){
            DP[i][j]=-1;
        }
    }
    a[0]=0;
    priority_queue<pair<double,int>,vector<pair<double,int>>,greater<pair<double,int>>> pq;
    for(int i=0;i<n;i++){
        if(!del[i]&&a[i]==0){
            DP[0][i]=0;
            pq.push({0,i});
        }
    }
    for(int p=0;p<=k;p++){
        if(p>0){
            for(int u=0;u<n;u++){
                if(!del[u]&&a[u]==2){
                    for(pair<int,int> &x:graph[u]){
                        int v=x.first,w=x.second;
                        if(v==h||del[v]){
                            continue;
                        }
                        double nxt=(DP[p-1][v]+w)/2.0;
                        if(DP[p][u]==-1||DP[p][u]>nxt){
                            DP[p][u]=nxt;
                        }
                    }
                    if(DP[p][u]!=-1){
                        pq.push({DP[p][u],u});
                    }
                }
            }
        }
        while(!pq.empty()){
            double d=pq.top().first;
            int u=pq.top().second;
            pq.pop();
            if(d>DP[p][u]){
                continue;
            }
            for(pair<int,int> &x:graph[u]){
                int v=x.first,w=x.second;
                if(v==h||del[v]){
                    continue;
                }
                if(DP[p][v]==-1||DP[p][v]>DP[p][u]+w){
                    DP[p][v]=DP[p][u]+w;
                    pq.push({DP[p][v],v});
                }
            }
        }
    }
    double ans=-1;
    for(pair<int,int> &x:graph[h]){
        int v=x.first,w=x.second;
        if(del[v]){
            continue;
        }
        for(int j=0;j<=k;j++){
            if(DP[j][v]==-1){
                continue;
            }
            if(ans==-1||ans>DP[j][v]+w){
                ans=DP[j][v]+w;
            }
        }
    }
    return ans;
}
/*signed main(){
    cout <<  solve(4, 4, 30, 3, {0, 0, 1, 2}, {1, 2, 3, 3}, {5, 4, 2, 4}, {1, 0, 2, 1});
}*/

#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...