题解 最短路问题 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,原因未知(卧槽。。。)

posted on 2014-07-31 16:33  一锅土豆  阅读(110)  评论(0编辑  收藏  举报