poj 2502 floyd 家-地铁站-学校

本文介绍了一种解决从家到学校最短时间路径的问题,通过建立图模型结合弗洛伊德算法(floyd),考虑了步行与乘坐地铁的不同速度及成本,实现了对不同路线的选择优化。

题意:给出家和学校的坐标,从家出发,沿途经过地铁站,一些地铁站是一条线上的,可以如果到地铁站的话,可以随便上车,步行和地铁的速度也给出,求家到学校的最短时间。

注意:地铁线不一定是直的,所以只要在一条地铁线并且是相邻的两站那么就建乘地铁的边,否则就步行。

思路:建图+floyd

#include<iostream>
#include<cmath>
#define INF 0x7ffffff
using namespace std;
struct point
{
  int x,y;
  int ans;
}P[210];

double get_dist(int i,int j)
{
  return sqrt(double((P[i].x-P[j].x)*(P[i].x-P[j].x)+(P[i].y-P[j].y)*(P[i].y-P[j].y)));
}

double dist[210][210];

int main()
{
  point start,end;
  //freopen("data.txt","r",stdin);
  //freopen("shuchu.txt","w",stdout);
  scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y);
  P[0].x=start.x;P[0].y=start.y;
  P[0].ans=0;
  int tx,ty,h=1,line=1,i,j,k,m=0;
  while(scanf("%d%d",&tx,&ty)!=EOF)
  {
    //if(line==3)  break;
    if(tx==-1&&ty==-1) {line++;continue;}
    P[h].x=tx;P[h].y=ty;    
    P[h].ans=line;
    h++;
  }
  P[h].ans=line;
  P[h].x=end.x;
  P[h].y=end.y;//输入完毕
  
  for(i=0;i<=h;i++)
  {
    for(j=i+1;j<=h;j++)
    {
      if(P[i].ans==P[j].ans&&j-i==1)//相邻地铁线需要的时间
      {
         dist[i][j]=dist[j][i]=get_dist(i,j)/(40000/60.0);
      }
      else  dist[i][j]=dist[j][i]=get_dist(i,j)/(10000/60.0);//不相邻的话,不能够直接建图,只能步行、
    }
  }
  for(i=0;i<=h;i++)
  dist[i][i]=0;//建图
  
   for(k=0;k<=h;k++)
     for(i=0;i<=h;i++)
       for(j=0;j<=h;j++)
       if(dist[i][k]+dist[k][j]<dist[i][j])
       dist[i][j]=dist[i][k]+dist[k][j];
       
       printf("%d\n",int(dist[0][h]+0.5));
       //system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值