• 采购特价商品


    题目背景

    《爱与愁的故事第三弹·shopping》第一章。

    题目描述

    中山路店山店海,成了购物狂爱与愁大神的“不归之路”。中山路上有n(n<=100)家店,每家店的坐标均在-10000~10000之间。其中的m家店之间有通路。若有通路,则表示可以从一家店走到另一家店,通路的距离为两点间的直线距离。现在爱与愁大神要找出从一家店到另一家店之间的最短距离。你能帮爱与愁大神算出吗?

    输入输出格式

    输入格式:

    共n+m+3行:

    第1行:整数n

    第2行~第n+1行:每行两个整数x和y,描述了一家店的坐标

    第n+2行:整数m

    第n+3行~第n+m+2行:每行描述一条通路,由两个整数i和j组成,表示第i家店和第j家店之间有通路。

    第n+m+3行:两个整数s和t,分别表示原点和目标店

    输出格式:

    仅一行:一个实数(保留两位小数),表示从s到t的最短路径长度。

    输入输出样例

    输入样例#1: 
    5
    0 0
    2 0
    2 2
    0 2
    3 1
    5
    1 2
    1 3
    1 4
    2 5
    3 5
    1 5
    输出样例#1:
    3.41

    说明

    100%数据:n<=100,m<=1000

    分析:

    点开这题一看。。。这不是我写过的题目吗(除了输出精度不同)。。。然后还换了个题面。。。

    详细分析见:最短路径问题

    代码(事实上代码除了输出都一样):

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<cmath>
    using namespace std;
    const int M=500005*2;
    const int oo=1<<30;
    queue<int> q;
    int n,m,s,t;
    int tot;
    int next[M],head[M],to[M];
    double adj[M];
    bool f[M];
    double d[M];
    inline int get(){
        int f=1;
        char c=getchar();
        int res=0;
        while (c<'0'||c>'9') {
            if (c=='-') f=-1;
            c=getchar();
        }
        while (c>='0'&&c<='9'){
            res=(res<<3)+(res<<1)+c-'0';
            c=getchar();
        }
        return res*f;
    }
    void add(int u,int v,double w){
        next[++tot]=head[u];
        head[u]=tot;
        adj[tot]=w;
        to[tot]=v;
        return ;
    }
    void spfa(){
        q.push(s);
        d[s]=0;
        f[s]=true;
        int u;
        while (!q.empty()){
            u=q.front();
            q.pop();
            f[u]=false;
            for (int j=head[u];j;j=next[j]){
                if (d[to[j]]>d[u]+adj[j]){
                    d[to[j]]=d[u]+adj[j];
                    if (!f[to[j]]){
                    q.push(to[j]);
                    f[to[j]]=true;
                    }
                }
            }
        }
        return ;
    }
    double x[M],y[M];
    int main(){
        n=get();
        for (int i=1;i<=n;i++) d[i]=oo;
        for (int i=1;i<=n;i++) x[i]=get(),y[i]=get();
        m=get();
        for (int i=1;i<=m;i++){
            int u,v;
            u=get(),v=get();
            double w=sqrt((x[u]-x[v])*(x[u]-x[v])+(y[u]-y[v])*(y[u]-y[v]));
            add(u,v,w);
            add(v,u,w);
        }
        memset(f,false,sizeof(f));
        s=get(),t=get();
        spfa();
        printf ("%.2f
    ",d[t]);
        //while (1);
        return 0;
    }
  • 相关阅读:
    Git -- 分支管理简介
    Git -- 从远程库克隆
    Git -- 添加远程仓库
    C# sha256 加密算法
    如何将IOS版本的更新下载文件指向到自己的服务器
    如何让windows服务器IIS支持.apk/.ipa文件下载
    vistual studio 去除 git 源代码 绑定
    Redis 环境搭建与使用(C#)
    c#图片添加水印
    C#使用WSDL服务总结
  • 原文地址:https://www.cnblogs.com/kanchuang/p/11150497.html
Copyright © 2020-2023  润新知