#include #define ALL(v) std::begin(v),std::end(v) using lint=long long; using ld=long double; templateusing numr=std::numeric_limits; struct input_t{templateoperator T(){T t;std::cin>>t;return t;}}input; using path_t=std::vector>; struct compare_t{ bool operator()(path_t const& a, path_t const& b)const{return a.back().second>b.back().second;}; }; templateauto mkvec(std::size_t sz,Args...args){ if constexpr(N==1)return std::vector(sz,args...); else return std::vector(sz,mkvec(args...)); } int main(){ std::cin.tie(nullptr);std::ios_base::sync_with_stdio(false); std::cout.setf(std::ios_base::fixed);std::cout.precision(15); lint n=input,m=input,K=input; lint s=input,t=input;s--,t--; std::vector>pt(n); for(auto&p:pt)std::cin>>p.first>>p.second; std::vector>>g(n); while(m--){ lint u=input,v=input;u--,v--; ld w=std::hypot(pt.at(u).first-pt.at(v).first,pt.at(u).second-pt.at(v).second); g.at(u).emplace_back(v,w); g.at(v).emplace_back(u,w); } ld inf=numr::infinity(); ld eps=1e-7; std::vectorans; auto dijkstra=[&](lint start, auto&&dead)->path_t{ std::priority_queue>que; std::vectordist(n,inf),prev(n); que.emplace(0,start); dist.at(start)=0; while(!que.empty()){ lint x=que.top().second;que.pop(); for(auto[y,w]:g.at(x)){ ld nd=dist.at(x)+w; if(dead.at(y)==2||dead.at(y)==1&&x==start||dist.at(y)-eps<=nd)continue; dist.at(y)=nd; prev.at(y)=x; que.emplace(-nd,y); } } if(dist.at(t)==inf)return {}; path_t path={{t,dist.at(t)}}; while(path.back().first!=start){ lint y=prev.at(path.back().first); path.emplace_back(y,dist.at(y)); } return path; }; { auto path=dijkstra(s,std::vector(n,0)); std::reverse(ALL(path)); ans.push_back(std::move(path)); } auto coprefix=[](auto&&a,auto&&b,std::size_t l){ if(a.size(),compare_t>que; for(lint k=1;kdead(n); for(auto&&b:ans)if(coprefix(b,b0,j))dead.at(b.at(j).first)=1; for(lint j_=0;j_=0;j_--)path.push_back(b0.at(j_)); std::reverse(ALL(path)); que.push(path); } bool found=false; while(!que.empty()){ auto path=que.top();que.pop(); lint sz=path.size(); bool ng=false; for(auto&&b:ans){ if((lint)b.size()!=sz)continue; for(lint i=0;i<=sz;i++){ if(i==sz){ ng=true; break; } if(path.at(i).first!=b.at(i).first)break; } } if(!ng){ found=true; ans.push_back(path); break; } } if(!found)break; } for(lint i=0;i