1205. By the Underground or by Foot? 夜

http://acm.timus.ru/problem.aspx?space=1&num=1205

spfa

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>

using namespace std;
const int INF=0x3f3f3f3f;
const int N=205;
double cost[N][N];
struct node
{
    double x,y;
}point[N];
int f[N];
double Fdist(int i,int j)
{
    return sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+
                (point[i].y-point[j].y)*(point[i].y-point[j].y));
}
double spfa(int s,int m,int &I)
{
    bool in[N];
    double dist[N];
    for(int i=0;i<=m;++i)
    {in[i]=false;dist[i]=-1.0;}
    queue<int>str;
    str.push(s);
    in[s]=true;
    dist[0]=0.0;
    while(!str.empty())
    {
        int x=str.front();str.pop();//cout<<x<<" "<<dist[x]<<endl;
        in[x]=false;
        for(int i=0;i<=m;++i)
        {
            if(i!=x&&(dist[i]<0.0||dist[i]>dist[x]+cost[x][i]))
            {
                dist[i]=dist[x]+cost[x][i];
                f[i]=x;
                if(!in[i])
                {
                    in[i]=true;
                    str.push(i);
                }
            }
        }
    }
    int k=f[m];
    I=0;
    while(k!=0)
    {
        ++I;
        k=f[k];
    }
    return dist[m];
}
void dfs(int x)
{
    if(f[x]!=0)
    dfs(f[x]);
    printf(" %d",x);
}
int main()
{
    //freopen("data.txt","r",stdin);
    double fv,uv;
    int n;
    while(scanf("%lf %lf",&fv,&uv)!=EOF)
    {
       scanf("%d",&n);
       for(int i=0;i<=n+1;i++)
       cost[i][i]=0.0;
       for(int i=1;i<=n;++i)
       {
           scanf("%lf %lf",&point[i].x,&point[i].y);
           for(int j=1;j<i;++j)
           {
               cost[i][j]=cost[j][i]=Fdist(i,j)/fv;
           }
       }
        int l1,l2;
        while(scanf("%d %d",&l1,&l2))
        {
            if(l1==0&&l2==0)
            break;
            cost[l1][l2]=cost[l2][l1]=min(cost[l1][l2],Fdist(l1,l2)/uv);
        }
        scanf("%lf %lf",&point[0].x,&point[0].y);
        scanf("%lf %lf",&point[n+1].x,&point[n+1].y);
        for(int i=0;i<=n+1;++i)
        {cost[i][0]=cost[0][i]=Fdist(0,i)/fv;cost[n+1][i]=cost[i][n+1]=Fdist(n+1,i)/fv;}
        int I;
        printf("%.6lf\n",spfa(0,n+1,I));
        printf("%d",I);
        if(I)
        dfs(f[n+1]);
        printf("\n");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/liulangye/p/2734245.html