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;
}
原文地址:https://www.cnblogs.com/planche/p/8688985.html