本题一个卡人的地方在于如何表示结束输入,可采用while(scanf() == 2),但结束输入时, scanf返回值是0,循环跳出
另外一点, 题目中说地铁中任意两个相邻的地铁站可看成直线,在计算 非相邻地铁之间的时间是,速度是10km/h,两个相邻的地铁之间的速度是40km/h,在这里错了很久
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const double inf = 99999999;
double dis[210], cost[210][210];
bool vis[210];
int k;
typedef struct
{
int x;
int y;
}
point;
point p[210];
double getdis(int i, int j)
{
int a = p[i].x - p[j].x;
int b = p[i].y - p[j].y;
return sqrt(1.0*a*a + 1.0*b*b);
}
void init()
{
for(int i=1; i<k; i++)
{
dis[i] = i==1 ? 0 : inf;
vis[i] = 0;
}
}
void dijkstra()
{
double m;
int i, j;
while(1)
{
m = inf;
for(i=1; i<k; i++)
if(!vis[i] && dis[i] < m)
m = dis[j = i];
vis[j] = 1;
if(j == 2)
break;
for(i=1; i<k; i++)
if(!vis[i])
dis[i] = min(dis[i], dis[j]+cost[j][i]);
}
printf("%d\n", (int)(dis[2]+0.5));
}
int main()
{
scanf("%d %d %d %d", &p[1].x, &p[1].y, &p[2].x, &p[2].y);
int flag = 0;
k = 3;
while(scanf("%d %d", &p[k].x, &p[k].y) == 2)
{
if(p[k].x==-1 && p[k].y==-1)
{
flag = 0;
continue;
}
if(flag)
{
double d = getdis(k, k-1);
cost[k-1][k] = cost[k][k-1] = 3*d/2000;
}
flag = 1;
k++;
}
for(int i=1; i<k; i++)
for(int j=i-1; j<k; j++)
if(cost[i][j] == 0 || cost[j][i] == 0)
{
double d = getdis(i, j);
cost[i][j] = cost[j][i] = 3*d/500;
}
init();
dijkstra();
return 0;
}