POJ 2502(floyd)

       从家到学校,可以步行,可以地铁,最少时间?典型的最短路径。令人纠结的是输入的处理非常的麻烦啊!

        迄今为止,我感觉输入最麻烦的一个吧!!!

       注意三点:

       一、每两点可达,即使没有地铁,也可以步行的;

       二、相邻地铁可达,不相邻不用管(换乘);

       三、地铁线不一定是直的。(这个没注意到,WA了好几次)

 

代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

typedef struct point
{
  double x,y;       
} Point;
Point p[205];

double dis[205][205]; 
double distance(Point a,Point b);//计算两点间距离 

double floyd(int tot);

int main()
{
  double ax,bx;
  int i,j,k,stop;
  memset(dis,0,sizeof(dis));  
    scanf("%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y);
   dis[0][1] = dis[1][0] = distance(p[0],p[1]);
  
   i = 2;
   while(1)  
   {
      if(scanf("%lf%lf",&ax,&bx) != 2) break; 
      k = i ;
      do
      { 
       
         p[i].x = ax ; p[i].y = bx ;   
         for(j = 0 ; j < i ; ++j)//计算新的点到其余各点的距离 
          dis[i][j] = dis[j][i] = distance(p[i],p[j]);
         ++i;
         
      }while(scanf("%lf%lf",&ax,&bx)&&(ax != -1 || bx != -1));
          
      for(j = k ; j < i-1 ; ++j)//地铁,距离缩小4倍,因为速度快4倍 
       dis[j][j+1] = dis[j+1][j] = distance(p[j],p[j+1])*0.25;
       
   }

  stop = i;
  printf("%.0lf\n",0.006*floyd(stop)); //换算成时间 
  //system("pause");
  return 0;    
}

double floyd(int tot)
{
  int i,j,k;
  double t;
  
  for(k = 0 ; k < tot ; ++k)
   for(i = 0 ; i < tot ; ++i)
    for(j = 0 ; j < tot ; ++j)      
    {
       if(dis[i][k] && dis[k][j])
       {
         t = dis[i][k] + dis[k][j];
         if(t < dis[i][j])
         dis[i][j] = t;             
       }               
    }
    return dis[0][1];
}

double distance(Point a,Point b)
{
  return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));       
}

  

posted @ 2012-02-20 19:53  开开甲  阅读(251)  评论(0编辑  收藏  举报