#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
const double inf = 1e18;
double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr) {
    K = min(K, 100);
    vector<vector<pair<int, int>>> adj(N);
    vector<vector<double>> dp(N, vector<double>(K+1, inf));
    
    // Build adjacency list
    for(int i = 0; i < M; i++) {
        adj[x[i]].emplace_back(y[i], c[i]);
        adj[y[i]].emplace_back(x[i], c[i]);
    }
    
    // Priority queue: (total_cost, current_node, discounts_used)
    priority_queue<tuple<double, int, int>, 
                  vector<tuple<double, int, int>>, 
                  greater<tuple<double, int, int>>> pq;
    
    // Initialize
    dp[0][0] = 0.0;
    pq.emplace(0.0, 0, 0);
    
    // Also push zero-cost nodes if they exist
    for(int i = 0; i < N; i++) {
        if(arr[i] == 0) {
            dp[i][0] = 0.0;
            pq.emplace(0.0, i, 0);
        }
    }
    
    while(!pq.empty()) {
        auto [current_cost, u, used] = pq.top();
        pq.pop();
        
        // Skip if we already found a better way
        if(current_cost > dp[u][used]) continue;
        
        // Early termination if we reach the target
        if(u == H) continue;
        
        for(auto &[v, w] : adj[u]) {
            // Option 1: Don't use discount
            double new_cost = current_cost + w;
            if(new_cost < dp[v][used]) {
                dp[v][used] = new_cost;
                pq.emplace(new_cost, v, used);
            }
            
            // Option 2: Use discount if available and allowed
            if(arr[u] == 2 && used < K) {
                double discounted_cost = current_cost + w/2.0;
                if(discounted_cost < dp[v][used+1]) {
                    dp[v][used+1] = discounted_cost;
                    pq.emplace(discounted_cost, v, used+1);
                }
            }
        }
    }
    
    // Find the minimal cost to reach H with any number of discounts
    double ans = *min_element(dp[H].begin(), dp[H].end());
    return ans >= inf/2 ? -1.0 : ans;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |