Subway POJ - 2502 spfa

Posted qingyuyyyyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Subway POJ - 2502 spfa相关的知识,希望对你有一定的参考价值。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int N=205;
const double INF=0x3f3f3f3f;
int k,l;
struct node
{
    double x,y;
    int num;
} s[N];
bool st[N];
double dist[N];
void spfa(int x)
{
    memset(st,false,sizeof st );
    for(int i=0;i<N;i++)
        dist[i]=INF;
    st[x]=true;
    dist[x]=0;
    queue<int>q;
    while(!q.empty())  
        q.pop();
    q.push(x);
    while(!q.empty())
    {
        int u=q.front();
        st[u]=false;
        q.pop();
        for(int i=1; i<=k; i++)
        {
            if(i==u)  
                continue;
            double far,t;
            far=sqrt(((s[u].y-s[i].y)*(s[u].y-s[i].y))+((s[u].x-s[i].x)*(s[u].x-s[i].x)));
            far=far/1000.0;
            if(fabs(s[u].num-s[i].num)==1)
                t=far/40.0;
            else
                t=far/10.0;
            if(dist[i]>dist[u]+t)
            {
                dist[i]=dist[u]+t;
                if(!st[i])
                {
                    st[i]=true;
                    q.push(i);
                }
            }
        }
    }
}
int main()
{
    double s1,s2,e1,e2;
    double x,y;
    k=2,l=1;
    cin>>s1>>s2>>e1>>e2;
    //只有相邻的站点能到
    while(cin>>x>>y)
    {
        if(x==-1&&y==-1)
        {
            if(l==8)
                break;
            l++;
            continue;
        }
        s[k].x=x,s[k].y=y;
        s[k++].num=l++;
    }
    s[1].x=s1,s[1].y=s2,s[1].num=-1;
    s[k].x=e1,s[k].y=e2,s[k].num=-3;
    spfa(1);
    //四舍五入 
    cout<<(int)(dist[k]*60+0.5)<<endl;
    return 0;
}

 

以上是关于Subway POJ - 2502 spfa的主要内容,如果未能解决你的问题,请参考以下文章

POJ2502:Subway(最短路)

Subway POJ - 2502

POJ 2502 SUBWAY(最短路)

Subway---poj2502(最短路)

POJ - 2502 Subway

POJ 2502 Subway-经过预处理的最短路