题解 最短路问题 POJ 2502
题意:乘坐地铁从家到学校,地铁40km/h 步行10km/h , 已知各个站点的x,y坐标,输入的信息每个列次用-1,-1隔开,要求花费的时间最少。
做法:用Dijkstra算法。数据类型为double。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define INF 0x3fffffff
using namespace std;
const int MAX=1010;
struct pos{
double x,y;}dot[MAX];
double a[MAX][MAX],dis[MAX];
bool v[MAX];
int n,T,l;
double x,y;
double len(double x1,double x2,double y1,double y2)
{
return sqrt(pow((x1-x2),2)+pow((y1-y2),2));
}
void Dijkstra()
{
int i,j,k;
for(j=1;j<=n;j++)
dis[j]=a[1][j];
dis[1]=0;v[1]=1;
int u,cnt=0;double minn;
for(k=1;k<n;k++)
{
minn=INF;
for(i=1;i<=n;i++)
if(!v[i]&&minn>dis[i])
minn=dis[i],u=i;
cnt+=minn;
v[u]=1;
for(i=1;i<=n;i++)
if(!v[i]&&(dis[i]>a[u][i]+minn))
dis[i]=a[u][i]+minn;
}
printf("%.0f\n",dis[n]);
}
int main()
{
int i,j,flag=1;
n=1;
memset(v,0,sizeof(v));
memset(a,0,sizeof(a));
double x1,y1,x0,y0;
scanf("%lf%lf%lf%lf",&x0,&y0,&x1,&y1);
dot[n].x=x0,dot[n].y=y0,n++;
while(scanf("%lf%lf",&x,&y)!=EOF)
{
if(x<0||y<0)
{flag=1;continue;}
dot[n].x=x,dot[n].y=y;
if(flag==0)
a[n][n-1]=a[n-1][n]=len(dot[n].x,dot[n-1].x,dot[n].y,dot[n-1].y)*3/2000;
flag=0;n++;
}
dot[n].x=x1,dot[n].y=y1;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]==0)
a[i][j]=len(dot[i].x,dot[j].x,dot[i].y,dot[j].y)*3/500;
Dijkstra();
return 0;
}
错误:WA 输出格式必须为%.0f,原因未知(卧槽。。。)
浙公网安备 33010602011771号