1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| const int N = 100005,C = 72,L = 70; typedef pair<double,pair<int,int>> LDII; vector<pair<int,int>> g[N]; double dis[N][C];
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){ for(int k=0;k<N;k++){ g[k].clear(); for(int j=0;j<=L;j++) dis[k][j] = 2e18; } for(int k=0;k<M;k++){ g[x[k]].emplace_back(y[k],c[k]); g[y[k]].emplace_back(x[k],c[k]); } priority_queue<LDII,vector<LDII>,greater<LDII>> q; q.push({0,{H,0}}); dis[H][0] = 0; while(!q.empty()){ auto [u,k] = q.top().second; q.pop(); for(auto[v,w]:g[u]){ if(v==H) continue; if(k>=L){ if(dis[v][L]>dis[u][k]){ dis[v][L] = dis[u][k]; q.push({dis[v][L],{v,L}}); } continue; } if(arr[v]==0){ if(dis[v][L]>dis[u][k]+w*1.0/(1ll<<k)){ dis[v][L] = dis[u][k]+w*1.0/(1ll<<k); q.push({dis[v][L],{v,L}}); } continue; } if(arr[v]==2&&k<K){ if(dis[v][k+1]>dis[u][k]+w*1.0/(1ll<<k)){ dis[v][k+1] = dis[u][k]+w*1.0/(1ll<<k); q.push({dis[v][k+1],{v,k+1}}); } } if(dis[v][k]>dis[u][k]+w*1.0/(1ll<<k)){ dis[v][k] = dis[u][k]+w*1.0/(1ll<<k); q.push({dis[v][k],{v,k}}); } } } double ans = 2e18; for(int k=0;k<=L;k++) ans = min(ans,dis[0][k]); if(ans>1e18) return -1; return ans; }
|