Description
Input
Output
Sample Input
0 0 10000 1000 0 200 5000 200 7000 200 -1 -1 2000 600 5000 600 10000 600 -1 -1
Sample Output
21
Source
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> #include<map> #include<vector> #include<set> #include<list> #include<stack> #include<queue> #include<iterator> using namespace std; const int maxn=420; const double inf=100000000; struct node { int to; int next; double weight; }edge[maxn*maxn]; struct _list { int x,y; }point[maxn]; int head[maxn]; double dist[maxn]; int tot; double dis(int x1,int y1,int x2,int y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } void addedge(int from,int to,double weight) { edge[tot].to=to; edge[tot].weight=weight; edge[tot].next=head[from]; head[from]=tot++; } int spfa(int n) { for(int i=0;i<=n;i++) dist[i]=inf; dist[1]=0; queue<int>qu; while(!qu.empty()) qu.pop(); qu.push(1); while(!qu.empty()) { int cur=qu.front(); qu.pop(); for(int i=head[cur];i!=-1;i=edge[i].next) { int v=edge[i].to; if(dist[v]>dist[cur]+edge[i].weight) { dist[v]=dist[cur]+edge[i].weight; qu.push(v); } } } return (dist[2]+0.5); } int main() { int sx,sy,tx,ty; while(~scanf("%d%d%d%d",&sx,&sy,&tx,&ty)) { memset(head,-1,sizeof(head)); tot=0; point[1].x=sx; point[1].y=sy; point[2].x=tx; point[2].y=ty; int x,y,t=3; int lastx=-1,lasty=-1; double v1=40000.0/60,v2=10000.0/60; while(scanf("%d%d",&x,&y)==2) { if(x==-1 && y==-1) { lastx=-1; lasty=-1; continue; } if(lastx!=-1 && lasty!=-1) { addedge(t-1,t,dis(lastx,lasty,x,y)/v1); addedge(t,t-1,dis(lastx,lasty,x,y)/v1); lastx=x; lasty=y; } else { lastx=x; lasty=y; } point[t].x=x; point[t++].y=y; } for(int i=1;i<t;i++) for(int j=1;j<t;j++) { addedge(i,j,dis(point[i].x,point[i].y,point[j].x ,point[j].y)/v2); addedge(j,i,dis(point[i].x,point[i].y,point[j].x ,point[j].y)/v2); } printf("%d\n",spfa(t)); } return 0; }