zoukankan      html  css  js  c++  java
  • P1744 采购特价商品

    题目描述

    中山路店山店海,成了购物狂爱与愁大神的“不归之路”。中山路上有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 <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define inf 2147483647
    const ll INF = 0x3f3f3f3f3f3f3f3fll;
    #define ri register int
    template <class T> inline T min(T a, T b, T c)
    {
        return min(min(a, b), c);
    }
    template <class T> inline T max(T a, T b, T c)
    {
        return max(max(a, b), c);
    }
    template <class T> inline T min(T a, T b, T c, T d)
    {
        return min(min(a, b), min(c, d));
    }
    template <class T> inline T max(T a, T b, T c, T d)
    {
        return max(max(a, b), max(c, d));
    }
    #define pi acos(-1)
    #define me(x, y) memset(x, y, sizeof(x));
    #define For(i, a, b) for (int i = a; i <= b; i++)
    #define FFor(i, a, b) for (int i = a; i >= b; i--)
    #define mp make_pair
    #define pb push_back
    const int maxn = 100005;
    #define mod 100003
    const int N=10000;
    
    // name*******************************
    int n,m;
    struct node
    {
        int x,y;
    } p[1005];
    struct edge
    {
        int to,next;
        double w;
    } e[N];
    int Head[N];
    int tot=0;
    int ss,tt;
    int vis[N];
    double dis[N];
    queue<int>que;
    // function******************************
    double dist(node a,node b)
    {
        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    void add(int u,int v,double w)
    {
        e[++tot].to=v;
        e[tot].next=Head[u];
        Head[u]=tot;
        e[tot].w=w;
    }
    
    void spfa(int u)
    {
        que.push(u);
        vis[u]=1;
        dis[u]=0;
        while(!que.empty())
        {
            int u=que.front();
            que.pop();
            vis[u]=0;
            for(int p=Head[u]; p; p=e[p].next)
            {
                int v=e[p].to;
                double w=e[p].w;
                if(dis[v]>dis[u]+w)
                {
                    dis[v]=dis[u]+w;
                    if(!vis[v])
                    {
                        vis[v]=1;
                        que.push(v);
                    }
                }
            }
        }
    }
    
    //***************************************
    int main()
    {
    //         freopen("test.txt", "r", stdin);
        cin>>n;
        For(i,1,n)
        scanf("%d%d",&p[i].x,&p[i].y);
        cin>>m;
        For(i,1,m)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            double c=dist(p[a],p[b]);
            add(a,b,c);
            add(b,a,c);
        }
        cin>>ss>>tt;
        For(i,1,n)
        dis[i]=inf;
        spfa(ss);
        printf("%.2f",dis[tt]);
    
        return 0;
    }
  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/planche/p/8688985.html
Copyright © 2011-2022 走看看