Submission #919613

#TimeUsernameProblemLanguageResultExecution timeMemory
919613noyancanturkCyberland (APIO23_cyberland)C++17
100 / 100
1132 ms12624 KiB
#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 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...