题目大意:在一个城市里,分布着若干条地铁线路,每条地铁线路有若干个站点,所有地铁的速度均为40km/h。现在你知道了出发地和终点的坐标,以及这些地铁线路每个站点的坐标,你的步行速度为10km/h,且你到了地铁的任意一个站之后就刚好有地铁出发。问你从出发点到终点最少需要多少时间。
解题思路:dijkstra单源最短路算法(模板)。对于这道题来说,关键是对题目给你的二维坐标点,如何转换为图的结点,以及图的边权为时间,有两种计算规则“地铁的是欧拉距离除以地铁速度,人是欧拉距离除以人的速度
难点:输入,如何输入确实很恶心,具体看代码~~
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=300;
const int INF=(1<<30);
int n,vis[maxn];
double Map[maxn][maxn],dis[maxn];
void init(int n)
{
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
if(i!=j) Map[i][j]=INF;
else Map[i][j]=0;
}
void Dijkstra(int src)
{
int i,j,minn,pos;
memset(vis,0,sizeof(vis));
for(i = 0; i<=n; i++)
dis[i] = Map[src][i];
dis[src] = 0;
vis[src] = 1;
for(i = 1; i<=n; i++)
{
minn = INF;
pos = 0;
for(j = 1; j<=n; j++)
{
if(minn>dis[j] && !vis[j])
minn = dis[pos = j];
}
vis[pos] = 1;
for(j = 1; j<=n; j++)
if(dis[j]>dis[pos]+Map[pos][j] && !vis[j])
dis[j] = dis[pos]+Map[pos][j];
}
}
struct Node
{
double x,y;
} node[maxn];
double dist(Node a,Node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
// freopen("1.txt","r",stdin);
double v1=10000.0/60;//步行速度
double v2=40000.0/60;//地铁速度
init(300);
scanf("%lf%lf%lf%lf",&node[1].x,&node[1].y,&node[2].x,&node[2].y);
n=3;
bool flag=false;
while(scanf("%lf%lf",&node[n].x,&node[n].y)!=EOF)
{
if(node[n].x==-1&&node[n].y==-1)
{
flag=false;
continue;
}
if(flag)
{
Map[n][n-1]=Map[n-1][n]=dist(node[n],node[n-1])/v2;
}
n++;
flag=true;
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
Map[i][j]=min(Map[i][j],dist(node[i],node[j])/v1);
Dijkstra(1);
printf("%.0lf\n",dis[2]);
}
本文探讨了在城市中利用Dijkstra算法解决地铁线路与步行相结合的最短路径问题,详细解释了输入处理、图构建及算法应用过程,旨在提供一种有效的方法来计算从出发点到终点的最少时间。
&spm=1001.2101.3001.5002&articleId=46741053&d=1&t=3&u=d6d5fb20d3ff498896792ff72b5cad04)
12万+

被折叠的 条评论
为什么被折叠?



