题意:首先给你两个坐标,一个是你家里的坐标,一个是你学校的坐标,然后接下来有若干条地铁线,一行为一条地铁线,每条地铁线上有若干个站点,给出每个站点的坐标,这个距离的单位是米,现在告诉你走路是10km/h,做地铁的话是40km/h,问你从家里到学校所花费的最短时间(分钟)
思路:首先先把单位统一为m/min,因为地铁给的距离是米,并且输出的答案为分钟数,10km/h=10000/60 (m/min)
40km/h = 40000 / 60 (m/min),地铁连接的按地铁速度连边,其他都按步行速度连边。然后就是套模板了
Trick:地铁相邻的站的速度才是40 Km/h,比如站一到站二,站一到站三并不是
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 305
#define LL long long
int cas=1,T;
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 n;
const double INF = 1<<29;
bool vis[maxn];
double d[maxn];
double mapp[maxn][maxn];
void dijkstra(int s)
{
for (int i = 1;i<=n;i++)
d[i]=INF;
memset(vis,0,sizeof(vis));
d[s]=0;
for (int i = 1;i<=n;i++)
{
int u=0;
double mins = INF;
for (int j = 1;j<=n;j++)
if (!vis[j] && d[j]<mins)
{
mins = d[j];
u=j;
}
if (u==0)
break;
vis[u]=1;
for (int j = 1;j<=n;j++)
if (!vis[j] && d[j]>d[u]+mapp[u][j])
d[j]=d[u]+mapp[u][j];
}
}
int main()
{
double walk = 10000.0 / 60;
double sub = 40000.0 / 60;
while (scanf("%lf%lf%lf%lf",&node[1].x,&node[1].y,&node[2].x,&node[2].y)==4)
{
n = 2;
int cnt = 3;
int x,y;
memset(mapp,0,sizeof(mapp));
for (int i = 1;i<=300;i++)
for (int j = 1;j<=300;j++)
{
if (i==j)
mapp[i][j]=0;
else
mapp[i][j]=INF;
}
while (scanf("%d%d",&x,&y)==2)
{
if (x==-1 && y == -1)
{
cnt = n+1;
continue;
}
n++;
node[n].x=x;
node[n].y=y;
if (n!=cnt) //只有相邻站点才能到达
mapp[n][n-1] = mapp[n-1][n] = min(mapp[n][n-1],dist(node[n],node[n-1])/sub);
}
for (int i= 1;i<=n;i++)
for (int j = 1;j<=n;j++)
mapp[i][j] = min(mapp[i][j],dist(node[i],node[j])/walk);
dijkstra(1);
printf("%d\n",(int)(d[2]+0.5));
}
//freopen("in","r",stdin);
//scanf("%d",&T);
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}
题目