题目背景
《爱与愁的故事第三弹·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\n",d[t]); //while (1); return 0; }
原文地址:https://www.cnblogs.com/kanchuang/p/11150497.html
时间: 2024-10-31 09:26:07