zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    安装TeX字体
    【数学】对数的底为什么不能为负数
    算法设计的要求
    Windows HTTP Services
    为什么分母不能为0
    循环小数怎样变分数
    在win7环境下批量修改文件权限
    算法复杂度的极限证明
    深入理解 【有理数】、【无理数】、【虚数】
    kettle连接sqlserver
  • 原文地址:https://www.cnblogs.com/liulangye/p/2734245.html
Copyright © 2011-2022 走看看