Submission #1326587

#TimeUsernameProblemLanguageResultExecution timeMemory
1326587eri16Cyberland (APIO23_cyberland)C++20
44 / 100
27 ms8940 KiB
#include <bits/stdc++.h>
#include "cyberland.h"

using namespace std;

vector <int> reachable(100005,0);
vector<pair<int,double>> adj[100005];

void dfs(int node, int parent, int target){
    if (reachable[node]==1){return;}
    if (node==target){return;}
    reachable[node]=1;
    for (auto [child,t] : adj[node]){
        if (child!=parent){
            dfs(child,node, target);
        }
    }
}

double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr){
    
    priority_queue<
    pair<double,int>,
    vector<pair<double,int>>,
    greater<pair<double,int>>
    > pq;
    
    pq.push({0,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]});
    }
    
    dfs(0,-1, H);
    
    vector<bool> vis(N, false);
    
    double mn=1e18;;
    
    while(!pq.empty()){
        auto [d,u]=pq.top();
        pq.pop();
        vis[u]=true;
        
        if(u==0 || (arr[u]==0 && reachable[u]==1)){mn=min(mn,d);}
        
        for(auto [v,t] : adj[u]){
            if(!vis[v]){
                pq.push({d+t,v});
            }
        }
    }
    fill(reachable.begin(), reachable.begin()+N, 0);   
    
    for(int i=0; i<N; i++){
        adj[i].clear();
    }    
    
    if (mn==1e18){return -1;}
    return mn;
}
#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...