//Accepted 504 KB 16 ms //spfa最短路 //把n个地铁站作为n个顶点,边权为从一个站到另一个站的时间 //注意:地铁在相邻的两站之间是直线行驶,但其他的就不是了 #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <cmath> #include <algorithm> using namespace std; /** * This is a documentation comment block * 如果有一天你坚持不下去了,就想想你为什么走到这儿! * @authr songt */ ; const double inf = 1000000000000000000.0; double x[imax_n]; double y[imax_n]; double a[imax_n][imax_n]; double dis[imax_n]; bool vis[imax_n]; int n; double getDis(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } void init() { ;i<=n;i++) { ;j<=n;j++) { ) { a[i][j]=getDis(x[i],y[i],x[j],y[j])*; //printf("%d %d ==> %d %d\n",x[i],y[i],x[j],y[j]); } } } } bool relax(int u,int v,double c) { ) { dis[v]=dis[u]+c; return true; } return false; } queue<int > q; bool spfa(int src) { while (!q.empty()) q.pop(); ;i<=n;i++) dis[i]=inf; dis[src]=; memset(vis,,sizeof(vis)); q.push(src); vis[src]=true; while (!q.empty()) { int pre=q.front(); q.pop(); vis[pre]=false; ;i<=n;i++) if (relax(pre,i,a[pre][i]) && !vis[i]) { vis[i]=true; q.push(i); } } } int main() { scanf(],&y[],&x[],&y[]); n=; double ca,cb; int start,end; ; ;i<imax_n;i++) { ;j<imax_n;j++) a[i][j]=0.0; } while (scanf("%lf%lf",&ca,&cb)!=EOF) { && cb==-) { end=n; for (int i=start;i<end;i++) { a[i][i+]=a[i+][i]=getDis(x[i],y[i],x[i+],y[i+])*; //printf("%d %d ==> %d %d\n",x[i],y[i],x[j],y[j]); } flag=; continue; } ++n; x[n]=ca; y[n]=cb; ) { start=n; flag=; } } init(); spfa(); printf(]); ; }