This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#pragma GCC optimize("O3,unroll-loops")
#ifndef Local
#include "cyberland.h"
#endif
#include <bits/stdc++.h>
using namespace std;
const int lim=1e5+10;
const double inf=2e18;
using pii=pair<int,int>;
using pdi=pair<double,int>;
vector<pii> v[lim];
bool vis[lim];
int n,m,k,h;
void dfs(int node){
vis[node]=1;
if(node==h)return;
for(auto [f,s]:v[node]){
if(!vis[f]){
dfs(f);
}
}
}
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) {
n=N,m=M,k=min(K,100),h=H;
for(int i=0;i<n;i++){
vis[i]=0;
v[i].clear();
}
for(int i=0;i<m;i++){
v[x[i]].push_back({y[i],c[i]});
v[y[i]].push_back({x[i],c[i]});
}
dfs(0);
double *dist[2];
dist[0]=new double[n];
dist[1]=new double[n];
//for(int i=0;i<n;i++)cerr<<vis[i]<<"\n";
for(int i=0;i<n;i++){
dist[0][i]=(arr[i]||!vis[i])?inf:0;
}
priority_queue<pdi,vector<pdi>,greater<pdi>>pq;
for(int i=0;i<n;i++){
if(!arr[i]&&vis[i]){
pq.push({0,i});
}
}
dist[0][0]=0;
pq.push({0,0});
//else cerr<<arr[0]<<"\n";
double ans=inf;
for(int rp=0;rp<min(k+1,100);rp++){
/*
for(int i=0;i<n;i++){
cerr<<dist[0][i]<<" ";
}cerr<<"\n";
*/
for(int i=0;i<n;i++){
dist[1][i]=inf;
}
while(pq.size()){
auto nn=pq.top();
pq.pop();
double cost=nn.first;
int node=nn.second;
/*
cerr<<node<<" "<<cost<<" visited\n";
cerr<<cost<<" "<<dist[0][node]<<"\n";
*/
if(dist[0][node]<cost||node==h)continue;
//cerr<<"ok\n";
for(auto j:v[node]){
//cerr<<j.first<<" "<<cost+j.second<<"\n";
//if(j.first==4&&cost+j.second==2)cerr<<node<<"\n";
if(arr[j.first]&&cost+j.second<dist[0][j.first]){
dist[0][j.first]=cost+j.second;
pq.push({cost+j.second,j.first});
//cerr<<node<<" inserted "<<j.first<<" "<<cost+j.second<<"\n";
//cerr<<dist[0][j.first]<<" "<<cost+j.second<<"\n";
}
if(arr[j.first]==2&&(cost+j.second)/2<dist[1][j.first]){
dist[1][j.first]=min(dist[1][j.first],(cost+j.second)/2);
}
//else cerr<<cost<<" "<<j.second<<" "<<dist[0][j.first]<<"\n";
}
}
/*
for(int i=0;i<n;i++){
cerr<<dist[0][i]<<" ";
}cerr<<"\n";
for(int i=0;i<n;i++){
cerr<<dist[1][i]<<" ";
}cerr<<"\n";
*/
//cerr<<h<<"\n";
for(int i=0;i<n;i++){
if(dist[1][i]!=inf)pq.push({dist[1][i],i});
}
ans=min(ans,dist[0][h]);
ans=min(ans,dist[1][h]);
//cerr<<ans<<"\n";
swap(dist[0],dist[1]);
}
/*
for(int i=0;i<n;i++){
cerr<<dist[0][i]<<" ";
}cerr<<"\n";
*/
if(ans==inf)return -1;
return ans;
}
#ifdef Local
int main(){
freopen(".in","r",stdin);
freopen(".out","w",stdout);
int t;
cin>>t;
while(t--){
cin>>n>>m>>k>>h;
vector<int>x,y,z,arr;
for(int i=0;i<n;i++){
int rr;
cin>>rr;
arr.push_back(rr);
}
for(int i=0;i<m;i++){
int xx,yy,zz;
cin>>xx>>yy>>zz;
x.push_back(xx);
y.push_back(yy);
z.push_back(zz);
}
cout<<setprecision(30)<<(double)solve(n,m,k,h,x,y,z,arr)<<"\n";
}
//cout<<solve(6, 7, 1, 4, {0, 0, 2, 1, 1, 3, 4}, {1, 2, 3, 2, 3, 4, 5}, {2, 3, 4, 2, 5, 3, 2}, {1, 0, 2, 1, 1, 0})<<"\n";
//cout<<solve(3,3,2,2,{0,1,2},{1,2,0},{2,2,3},{1,2,1})<<"\n";
}
#endif
# | 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... |