POJ

来源:互联网 发布:ios开发用什么数据库 编辑:程序博客网 时间:2024/06/03 05:36
/*题意就是求去学校所花最短时间,在每一段距离中我们可以选择步行也可以选择坐地铁,因为有些路可能没有地铁,所以我们需要选择最佳路径输入家和学校的坐标;然后再给出你地铁的坐标,这个就是卡你的输入了,因为它那个每次走到-1 -1 的时候呢它的第一个节点是不能读取的,因为只有相邻的两个节点,它才会有距离感。这个后续解释;那么咋们应该怎么solve it?首选dijkstra,因为它的地铁站点一共就200个,所以说用dijkstra应该来说没什么问题;*/#include<cstdio>#include<cmath>#include<iostream>#include<algorithm>#include<iomanip>//#include<bits/stdc++.h>using namespace std;const int maxn=3e2+7;struct Node{    double x,y;}node[maxn];double far(Node a,Node b)///间距吧;{    return sqrt(double((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));}const double inf=1e7+7;bool vis[maxn];double dis[maxn],mmp[maxn][maxn];/*int n;这个是真的坑,我傻逼的定义了两个n后来以为会传到函数里面  看了半天,没有错误啊,后来输出n的时候发现n'的值变为了0  尴尬尴尬的找了一个晚上;*/void Dijkstra(int n){    for(int i=1;i<=n;i++)    {        dis[i]=mmp[1][i];        vis[i]=false;    }    //printf("%d\n",n);    //memset(vis,false,sizeof(vis));    //dis[1]=0;    vis[1]=true;    for(int j=1;j<n;j++)    {        int k;        double Min=inf;///后来发现连这个for都走不进去;        for(int i=1;i<=n;i++)            if(!vis[i]&&dis[i]<Min)            {                Min=dis[i];                k=i;            }        //if(k==-1) break;        vis[k]=true;        for(int i=1;i<=n;i++)            if(!vis[i]&&(dis[k]+mmp[k][i])<dis[i])            dis[i]=dis[k]+mmp[k][i];    }    /*for(int i=1;i<=n;i++)        printf("%.0f\n",dis[i]);*/    printf("%.0f\n",dis[2]);}int main (){    double xx,yy;    int n=2,flag;    /*for(int i=1;i<=maxn;i++)        for(int j=1;j<=maxn;j++)        if(i==j) mmp[i][j]=0;    else mmp[i][j]=inf;*///将mmp进行初始化;    scanf("%lf %lf %lf %lf",&node[1].x,&node[1].y,&node[2].x,&node[2].y);    mmp[1][2]=mmp[2][1]=far(node[1],node[2]);    while(~scanf("%lf %lf",&xx,&yy))    {        if(xx==-1&&yy==-1) { flag=1;continue;}        n++;        node[n].x=xx,node[n].y=yy;        for(int i=1;i<n;i++)            mmp[i][n]=mmp[n][i]=far(node[i],node[n])/500*3;//将每次与它可能相邻的节点的距离进行计算得到步行的结果所需时间;            ///每次都更新到最后一个站台的时间            ///不知道为甚么,这样写的话呢总感觉自己写的哪里不对劲。这样产生的时间它那个后来不是进行覆盖了吗??            ///后来发现它求的只是到最后一个站台走路花的时间,这样就减少了初始化的时间啊。对后面的地铁时间并没有影响;        if(!flag) mmp[n][n-1]=mmp[n-1][n]=far(node[n],node[n-1])/2000*3;        else flag=0;    }//printf("%d\n",n);/*for(int j=1;j<=n;j++)   {       for(int k=1;k<=n;k++)       {           printf("%f \n",mmp[j][k]);       }       printf("\n");   }*/    /*for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)        mmp[i][j]=min(mmp[i][j],far(node[i],node[j])/500*3);*/        ///这个呢,其实可以结合mmp的初始化,拉出来去求两点之间的最小值(时间);    Dijkstra(n);    return 0;}
原创粉丝点击