[kuangbin带你飞]专题四 最短路练习 L POJ 2502

来源:互联网 发布:方便面 减肥 知乎 编辑:程序博客网 时间:2024/04/29 16:25

题目地址:https://vjudge.net/contest/66569#problem/L

思路:基本的最短路,输入有点麻烦,每次碰到-1,-1,说明是另一条新线,以EOF结尾。然后跑一次dij即可。

AC代码:

#include<iostream>#include<cstdio>#include<queue>#include<vector>#include<cstring>#include<cmath>#include<map>#define INF 0x3f3f3f3fusing namespace std;struct pos{    int x,y;}S[205];double E[205][205];double d[205];int main(){    int x,y;   for(int i=0;i<205;i++)   {       d[i]=INF;       for(int j=0;j<205;j++)        E[i][j]=INF;   }    scanf("%d%d",&x,&y);    S[1].x=x,S[1].y=y;    scanf("%d%d",&x,&y);    S[2].x=x,S[2].y=y;    int k=3;    int first=1;    int pre;    while(~scanf("%d%d",&x,&y))    {        if(x==-1&&y==-1)        {            first=1;            continue;        }       int now=-1;       for(int i=1;i<k;i++)       {           if(S[i].x==x && S[i].y==y)           {               now=i;               break;           }       }       if(now==-1)       {           now=k;           S[k].x=x,S[k].y=y;           k++;       }        if(first)        {            first=0;        }        else        {            double dis=sqrt((x-S[pre].x)*(x-S[pre].x)+(y-S[pre].y)*(y-S[pre].y));            dis=dis/40000;            //printf("%f\n",dis);            E[pre][now]=E[now][pre]=dis;        }        pre=now;    }    for(int i=1;i<k;i++)        for(int j=1;j<k;j++)    {        if(i==j)            continue;        double temp=sqrt((S[i].x-S[j].x)*(S[i].x-S[j].x)+(S[i].y-S[j].y)*(S[i].y-S[j].y));        //printf("%f\n",temp);        temp=temp/10000;        if(E[i][j]>temp)        {            E[i][j]=E[j][i]=temp;        }    }    priority_queue<pair<double,int> >q;    d[1]=0;    q.push(make_pair(-d[1],1));    while(!q.empty())    {        int now=q.top().second;        q.pop();        for(int i=1;i<k;i++)        {            if(i==now)            continue;            if(d[i]>d[now]+E[now][i])            {                d[i]=d[now]+E[now][i];                q.push(make_pair(-d[i],i));            }        }    }    printf("%.0f\n",d[2]*60);}


0 0
原创粉丝点击