ZOJ 1891 Subway (dijkstra)

从家走到学校,怎样时间最短?

 

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

你可能感兴趣的:(ZOJ 1891 Subway (dijkstra))