题目背景
《爱与愁的故事第三弹·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的最短路径长度。
5 0 0 2 0 2 2 0 2 3 1 5 1 2 1 3 1 4 2 5 3 5 1 5
3.41
Floyd 算法
#include<bits/stdc++.h>
using namespace std;
long long a[1001][1001];
double d[1001][1001];
int main(){
int n,j,m;
cin>>n;
for(j=1;j<=n;j++){
cin>>a[j][1]>>a[j][2];
}
// int m;
//cin>>m;
for(j=0;j<999;j++){
for(int k=0;k<999;k++){
d[j][k]=999999;
//if(j==k) d[j][k]=0;
}
}
cin>>m;
for(j=1;j<=m;j++){
int x,y;
scanf("%d%d",&x,&y);
d[x][y]=d[y][x]=sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));
}
int s,t;
cin>>s>>t;
// cin>>s>>t;
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i!=j&&i!=k&&j!=k){
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
}
// cout<<d[s][t]<<endl;
printf("%0.2f\n",d[s][t]);
}