HDU - 2502 Subway

时间:2020-12-05 19:52:15

题目链接:http://poj.org/problem?id=2502

分析:

告诉一些地铁线路,从起点到终点,中途可以步行,可以坐地铁,找一条最短的路

主要是把图建立好,然后直接dijkstra或者floyd,因为速度不同,所以转化成求最短的时间

题目大致处理方法就是将每个地铁站点与相邻的站点用时先算出,然后再算各个点之间步行耗时,最后一个dijkstra。 

*:scanf的返回值由后面的参数决定scanf("%d%d",&a,&b);

如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF.
且返回值为int型.

Sample Input

      - -
- -1 Sample Output

**********************************************

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stdlib.h>
#include<map>
#include<cmath> using namespace std; #define N 2500
#define INF 0x3f3f3f3f double v1=40000.0/,v2=10000.0/;
double maps[N][N], dist[N];
int vis[N], k=;; struct node
{
int x,y;
} p[N]; node s,e; double Len(node a,node b)
{
double x=a.x-b.x;
double y=a.y-b.y;
double len=sqrt(x*x+y*y);
return len;
} void Init()
{
for(int i=; i<N; i++)
{
for(int j=; j<N; j++)
maps[i][j]=(i==j)?:INF;
dist[i]=INF;
}
} void dij()
{
int i,j; for(i=; i<k; i++)
dist[i]=maps[][i]; vis[]=; for(i=; i<k; i++)
{
double Min=INF;
int index=-;
for(j=; j<k; j++)
{
if(vis[j]==&&Min>dist[j])
{
Min=dist[j];
index=j;
}
}
if(index==-) break;
vis[index]=; for(j=;j<k;j++)
if(dist[j]>maps[index][j]+dist[index]&&vis[j]==)
dist[j]=maps[index][j]+dist[index];
}
} int main()
{
int x,y,f=, i,j; scanf("%d %d", &s.x,&s.y);
scanf("%d %d",&e.x,&e.y);
p[]=s;
p[]=e; memset(vis,,sizeof(vis));
memset(maps,,sizeof(maps));
Init(); dist[]=;
vis[]=; while(scanf("%d %d",&x,&y)==)/*/
{
if(x==-&&y==-)
{
f=;
continue ;
} p[k].x=x;
p[k].y=y; if(f==)
maps[k][k-]=maps[k-][k]=min(maps[k][k-], Len(p[k],p[k-])/v1);
f=;
k++;
}
for(i=; i<k; i++)
for(j=; j<k; j++)
maps[i][j]=maps[j][i]=min(maps[i][j], Len(p[i],p[j])/v2); dij(); printf("%.0f\n", dist[]); return ;
}