点击打开链接
// main.cpp
// test
//
// Created by 吴有堃 on 2017/9/11.
// Copyright © 2017年 吴有堃. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <cstring>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
#define LL long long
#define inf 0x3f3f3f3f
#define mod 1e9+7
using namespace std;
const int maxn=205;
double Map[maxn][maxn],d[maxn];
int n=2;
struct Point{
double x,y;
}P[maxn];
bool v[maxn];
void solve()
{
memset(v,false,sizeof(v));
for(int i=0;i<=n;i++)d[i]=Map[0][i];
d[0]=0;
for(int i=0;i<=n;i++){
int x=0,m=inf;
for(int y=0;y<=n;y++)if(!v[y]&&d[y]<m) m=d[x=y];
v[x]=1;
for(int y=0;y<=n;y++){
if(d[y]>(d[x]+Map[x][y])){
d[y]=d[x]+Map[x][y];
///cout<<d[y]<<endl;
}
}
}
}
int main()
{
double temp=0;
scanf("%lf %lf %lf %lf",&P[0].x,&P[0].y,&P[1].x,&P[1].y);
int flag=0;
memset(Map,0,sizeof(Map));
n=2;
//int num=0;
while (scanf("%lf %lf",&P[n].x,&P[n].y)!=EOF) {
if(P[n].x==-1&&P[n].y==-1){
flag=0; continue;
}
if(flag){
temp=(sqrt((P[n].x-P[n-1].x)*(P[n].x-P[n-1].x)+(P[n].y-P[n-1].y)*(P[n].y-P[n-1].y)))/40000.0*60.0;
Map[n][n-1]=Map[n-1][n]=temp;
}
n+=1;
flag=1;// 就是控制第一个不能单独就计算了
}
n-=1;//这才是最后的实际点数;包括家和学校
//printf("%d\n",n);
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
if(i!=j&&Map[i][j]==0.0){//不能自环使用,已经地铁用过的肯定快,就计算剩下所有人步行的。
Map[i][j]=Map[j][i]=(sqrt((P[i].x-P[j].x)*(P[i].x-P[j].x)+(P[i].y-P[j].y)*(P[i].y-P[j].y)))/10000.0*60.0;
}
if(i==j){
Map[i][j]=inf;
}
}
}
/*
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
printf("%f ",Map[i][j]);
}
printf("\n");
}
*/
solve();
printf("%d\n",int(d[1]+0.5));
return 0;
}