#include<stdio.h> #include<string.h> #include<math.h> #define inf 0x3fffffff #define N 200 #define eps 1e-10 #include<queue> using namespace std; struct node { int x,y; }ma[N]; struct nodee { int u,v,next; double w; }bian[N*N]; int yong,head[N],n; void addedge(int u,int v,double w) { bian[yong].u=u; bian[yong].v=v; bian[yong].w=w; bian[yong].next=head[u]; head[u]=yong++; } double MIN(double a,double b) { return a>b?b:a; } void bfs() {//宽搜 queue<int>q; double dist[N]; int step[N],i,visit[N]; memset(visit,0,sizeof(visit)); while(!q.empty()) q.pop(); q.push(0); for(i=1;i<=n+1;i++) dist[i]=inf; step[0]=0; dist[0]=0;visit[0]=1; while(!q.empty()){ int cur=q.front(); q.pop(); for(i=head[cur];i!=-1;i=bian[i].next) { int v=bian[i].v; if((dist[v]>dist[cur]+bian[i].w+eps||fabs(dist[v]-dist[cur]-bian[i].w)<=eps)&&step[v]>step[cur]+1&&visit[v]==0) {//判断条件如果相等就要比较它的最少的步数 step[v]=step[cur]+1; dist[v]=dist[cur]+bian[i].w; visit[v]=1; q.push(v); } } } if(dist[n+1]<inf) printf("%.2f %d ",dist[n+1],step[n+1]); else printf("can't be saved "); return ; } int main() { int i,j,s,t; double limit,minn; while(scanf("%d%lf",&n,&limit)!=EOF) { t=n+1;s=0; yong=0; memset(head,-1,sizeof(head)); for(i=1;i<=n;i++) { scanf("%d%d",&ma[i].x,&ma[i].y); minn=MIN(fabs(50.0-fabs(1.0*ma[i].x)),fabs(50.0-fabs(1.0*ma[i].y))); if(minn<limit+eps) {//将符合条件的边 addedge(i,t,minn); addedge(t,i,0);// } minn=fabs(sqrt(1.0*ma[i].x*ma[i].x+1.0*ma[i].y*ma[i].y)-7.5); if(minn<limit+eps) { addedge(s,i,minn);// addedge(i,s,0);// } } if(limit+eps>42.50) {//如果可以直接跳到岸上就直接输出 printf("42.50 1 "); continue; } for(i=1;i<n;i++) for(j=i+1;j<=n;j++) { minn=inf; minn=MIN(minn,sqrt(1.0*(ma[i].x-ma[j].x)*(ma[i].x-ma[j].x)+1.0*(ma[i].y-ma[j].y)*(ma[i].y-ma[j].y))); if(minn<limit+eps) { addedge(i,j,minn); addedge(j,i,minn);//双向边 } } bfs(); } return 0; }