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;
    }
    
  • 相关阅读:
    深入理解加密、解密、数字签名和数字证书
    支付网关的设计
    spring boot Rabbitmq集成,延时消息队列实现
    五一之起一台服务器玩玩-u盘安装centos
    shell初识
    用户身份切换之初窥企业远程用户没root还有root权限
    man帮助文档打印
    开源镜像软件下载网址{转载}
    bash shell第一课
    jQuery常用ajax操作
  • 原文地址:https://www.cnblogs.com/liulangye/p/2734245.html
Copyright © 2011-2022 走看看