题目链接 :http://poj.org/problem?id=2502
题目大意:一个学生去上学,步行的速度是10 km/h,乘地铁是40 km/h,给出你几条地铁线,每条地铁线有几个车站。
自由选择上下车,求出最快的到校时间是多少分钟。
代码如下(细节详见注释):
//迪杰斯特拉没啥不同,关键是建map
#include<stdio.h>
#include<math.h>
#define INF 100000000
#define distance(t,s) sqrt((t.x-s.x)*(t.x-s.x)+(t.y-s.y)*(t.y-s.y))
double vv=40000.0/60.0;
//10 km/h=10000/60 m/min ***** 40
struct node{
double x,y;
};
node a[205];
int index;
int sub[205];
double map[205][205],dis[205];
int vi[205];
double MIN(double a,double b)
{
if(a<b)
return a;
else
return b;
}
void Dj(int n)
{
for(int i=1;i<n;i++)
{
dis[i]=map[1][i];
vi[i]=0;
}
vi[1]=1;
for(int i=1;i<n;i++)
{
int p;
double MIN=INF;
for(int j=1;j<n;j++)
{
if(!vi[j] && dis[j]<MIN)
{
MIN=dis[j];
p=j;
}
}
vi[p]=1;
for(int j=1;j<n;j++)
{
if(dis[j]>dis[p]+map[p][j])
dis[j]=dis[p]+map[p][j];
}
}
}
int ex(node t)
{
int i;
for( i=1;i<index;i++)
{
if(a[index].x==t.x && a[index].y==t.y)
break;
}
if(i==index)
a[index++]=t;
return i;
}
int main()
{
node tem;
int count=0;
for(int i=0;i<205;i++)
{
for(int j=0;j<205;j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=INF;
}
}
//本题家,学校只输入一次
scanf("%lf%lf%lf%lf",&a[1].x,&a[1].y,&a[2].x,&a[2].y);
index=3;
while(~scanf("%lf%lf",&tem.x,&tem.y))
{
count=1;
sub[count++]=ex(tem);
while(scanf("%lf%lf",&tem.x,&tem.y)&& (tem.x!=-1 && tem.y!=-1))
{
sub[count++]=ex(tem);//建图时要去重
}
for(int i=2;i<count;i++)
{//每条地铁线在map中算出时间
map[sub[i]][sub[i-1]]=map[sub[i-1]][sub[i]]=distance(a[sub[i]],a[sub[i-1]])*3.0/2000.0;
}
}
for(int i=1;i<index;i++)
{
for(int j=1;j<=i;j++)
{//由于每个站点都可以步行去,所以把步行的的时间都加上 ,最后的把求最短路径的任务交给Dj函数
map[i][j]=map[j][i]=MIN(map[i][j],distance(a[i],a[j])*3.0/500.0);
}
}
Dj(index);
printf("%d\n",(int)(dis[2]+0.5));
return 0;
}