poj 2502 Subway

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值