Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cmath>
- #include <iomanip>
- #include <queue>
- #include <map>
- using namespace std;
- inline int sq(int x){return x*x;}
- int x[200],y[200];
- int n,k,r;
- vector<int> g[200];
- inline int l_sq(int i,int j){return sq(x[i]-x[j])+sq(y[i]-y[j]);}
- inline long double l(int i,int j){return sqrt(l_sq(i,j));}
- void make_graph()
- {
- for(int i=0;i<n-1;i++)
- {
- int vx=x[i+1]-x[i],vy=y[i+1]-y[i];
- for(int j=i+1;j<n;j++)
- if(l_sq(i,j)<sq(r))
- {
- int jx=x[j]-x[i],jy=y[j]-y[i];
- if(vx*jy-vy*jx>=0)
- {
- g[i].push_back(j);
- g[j].push_back(i);
- vx=jx;
- vy=jy;
- }
- }
- }
- }
- int main()
- {
- cin>>n>>k>>r;
- for(int i=0;i<n;i++)cin>>x[i]>>y[i];
- make_graph();
- long double d[200][200];
- d[0][0]=0;
- for(int j=1;j<n;j++)d[0][j]=d[0][j-1]+l(j-1,j);
- for(int i=1;i<=k;i++)
- {
- d[i][0]=0;
- for(int j=1;j<n;j++)
- {
- d[i][j]=d[i][j-1]+l(j-1,j);
- for(int m=0;m<g[j].size();m++)
- {
- int t=g[j][m];
- d[i][j]=min(d[i][j],d[i-1][t]+l(t,j));
- }
- }
- for(int j=n-2;j>0;j--)
- d[i][j]=min(d[i][j],d[i][j+1]+l(j,j+1));
- }
- long double res=d[0][n-1];
- for(int i=0;i<=k;i++)res=min(res,d[i][n-1]);
- cout<<fixed<<setprecision(5)<<res<<'\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment