您的位置:首页 > 其它

ZOJ 1891 Subway (dijkstra)

2010-07-30 20:07 330 查看
从家走到学校,怎样时间最短?

有两种行进方式,走路,坐地铁,他们的速度不一样(注意在运算的时候要变换单位,题目求的时间是分钟,而且题目给的坐标是以米为单位,不是千米)。给出几条地铁线路和他们的节点,相邻节点之间肯定做地铁,然后把走路的路线弄出来,非地铁路线均是走路路线。。。。然后dijkstra。。。就OK了、

#include<stdio.h>
#include<math.h>
#include<string.h>
struct point
{
double x;
double y;
}home,temp,shul,pre,points[210];

const double INF = 10e10;

int main(void)
{
double mat[210][210];
int a,flag[210];
double dist[210],min;
int start,i,now,j;
while(scanf("%lf%lf%lf%lf",&home.x,&home.y,&shul.x,&shul.y)!=EOF)
{
points[1]=home;
points[2]=shul;
start=2;
for(i=1;i<210;i++)
for(j=1;j<210;j++)
mat[i][j]=mat[j][i]=INF;
memset(flag,0,sizeof(flag));
for(i=1;i<210;i++) dist[i]=INF;
while(scanf("%lf%lf",&temp.x,&temp.y))
{
if(temp.x+1<=10e-8 && temp.y+1<=10e-8) break;
points[++start] = pre = temp;
while(scanf("%lf%lf",&temp.x,&temp.y))
{
if(temp.x+1<=10e-8&& temp.y+1<=10e-8) break;
points[++start]=temp;
mat[start-1][start]=mat[start][start-1]
=sqrt((pre.x-temp.x)*(pre.x-temp.x)+(pre.y-temp.y)*(pre.y-temp.y))*3/2000;
pre=temp;
}

}
for(i=1;i<=start;i++)//所有可能的边罗列出来,把除了地铁的全部弄成走路的
for(j=1;j<=start;j++)
{
if(i==j) continue;
if(fabs(mat[i][j]-INF)<=10e-8)
{
mat[i][j]=mat[j][i]=
sqrt((points[i].x-points[j].x)*(points[i].x-points[j].x)+
(points[i].y-points[j].y)*(points[i].y-points[j].y))*3/500;
}
}

now=1;dist[1]=0;flag[1]=1;//dijkstra求解过程。。一般都能写出来。。
for(i=1;i<start;i++)
{
for(j=1;j<=start;j++)
if(flag[j] ==0 && dist[j] > dist[now] + mat[now][j])
dist[j] = dist[now] + mat[now][j];
for(j=1,min=INF;j<=start;j++)
if(dist[j] < min && flag[j] == 0)
{now=j;min=dist[j];}
flag[now]=1;
}
a=(int)dist[2];
if(dist[2]-a>=0.5) a++;
printf("%d/n",a);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: