zoukankan      html  css  js  c++  java
  • URAL 1205 By the Underground or by Foot?(SPFA)

    By the Underground or by Foot?

    Time limit: 1.0 second
    Memory limit: 64 MB
    Imagine yourself in a big city. You want to get from point A to point B. To do that you may move by foot or use the underground. Moving by the underground is faster but you may enter and exit it only at the stations. To save your time you decided to write a program to find the fastest route.

    Input

    The first line contains two floating point numbers. First of them is the speed of traveling by foot. The second one is the speed of traveling by the underground. The second speed is always greater than the first one.
    Then description of the underground follows. It starts with an integer number N in the first line. It is the number of the underground stations. You may assume that N is not greater than 200. The following N lines contain two floating point numbers each (i-th line contains the coordinates of i-th station). Then the description of the connections between stations follows. Each connection is determined by the pair of integers, i.e. by the numbers of connected stations. The list of connections is terminates with a pair of zeroes. We assume that all the connections are straight. So the time we need to travel between stations is equal to the distance between stations divided by the speed of traveling by the underground.
    It should be mentioned also that entering and exiting the underground and changing trains are possible at the stations only and takes no time.
    At last the coordinates of the points A and B are given, tha pair of coordinates in a line.

    Output

    The first line should contain the minimal time needed to get from the point A to the point B. Time should be given with the precision of 10−6. The second line describes the use of the underground while traveling. It starts with the number of visited stations with tha following list of visited stations in the order they should be visited.

    Sample

    inputoutput
    1 100
    4
    0 0
    1 0
    9 0
    9 9
    1 2
    1 3
    2 4
    0 0
    10 10
    10 0
    
    2.6346295
    4 4 2 1 3
    
    Problem Author: Alexander Klepinin
    【分析】最短路,SPFA。
     
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <time.h>
    #include <string>
    #include <map>
    #include <stack>
    #include <vector>
    #include <set>
    #include <queue>
    #define inf 0x3f3f3f3f
    #define mod 10000
    typedef long long ll;
    using namespace std;
    const int N=205;
    const int M=100005;
    int n,m,k=0;
    double a,b;
    int vis[N],pre[N];
    double w[N][N],d[N];
    char str[20];
    bool flag=false;
    struct man{
        double x,y;
    }point[N];
    void spfa()
    {
        d[0]=0;
        vis[0]=1;
        queue<int>q;
        q.push(0);
        while(!q.empty()){
            int t=q.front();q.pop();
            vis[t]=0;
            for(int i=0;i<=n+1;i++){
                if(d[i]>d[t]+w[t][i]){
                    d[i]=d[t]+w[t][i];
                    pre[i]=t;
                    if(!vis[i])q.push(i),vis[i]=1;
                }
            }
        }
    }
    int main() {
        for(int i=0;i<N;i++){
            d[i]=10000000;
            for(int j=0;j<N;j++){
                w[i][j]=10000000;
            }
        }
        scanf("%lf%lf",&a,&b);
        scanf("%d",&n);
        int u,v;
    
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&point[i].x,&point[i].y);
        }
        while(~scanf("%d%d",&u,&v)&&u&&v){
            double s=sqrt((point[u].x-point[v].x)*(point[u].x-point[v].x)+(point[u].y-point[v].y)*(point[u].y-point[v].y));
            w[u][v]=w[v][u]=s/b;
        }
        scanf("%lf%lf%lf%lf",&point[0].x,&point[0].y,&point[n+1].x,&point[n+1].y);
        for(int i=0;i<=n+1;i++){
            for(int j=i+1;j<=n+1;j++){
                if(w[i][j]<10000000)continue;
                double s=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));
                w[i][j]=w[i][j]=s/a;
            }
        }
        spfa();
        printf("%.7lf
    ",d[n+1]);
        stack<int>p;
        for(int i=n+1;pre[i];i=pre[i]){
            p.push(pre[i]);
        }
        printf("%d",p.size());
        while(!p.empty())printf(" %d",p.top()),p.pop();
        return 0;
    }
    View Code
  • 相关阅读:
    linux 更换golang版本
    ubuntu 搭建NFS
    golang 异步并发http轮询(爬虫)
    Mysql 事务锁等待时间超时
    排序算法之鸡尾酒排序
    Sql Server一个表向另一个表添加多条数据,关联时查询出一条数据
    Easyui datagrid 开始时间不能大于结束时间
    用python爬了上千万条招聘信息后,最终分析出python要学这些才能就业...
    用python把B站小姐姐跳舞视频爬下来,并打包成可以直接运行的exe文件
    女朋友股票亏惨了,我一怒之下用Python爬取了证券最新数据...
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5875457.html
Copyright © 2011-2022 走看看