poj 2502 Subway

来源:互联网 发布:最新通达信软件 编辑:程序博客网 时间:2024/06/05 03:59

 本题一个卡人的地方在于如何表示结束输入,可采用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;}


原创粉丝点击