题目
那这道题其实求的就是单源最短路径
分析
但对于蒟蒻来说
Floyd是必须的
代码
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int o(int t){return t*t;}
int n,m,x[102],y[102],l,r; double f[102][102];
int main(){
scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
for (int i=0;i<=n+1;i++) for (int j=0;j<=n+1;j++) f[i][j]=0x7fffffff;
scanf("%d",&m);for (int i=1;i<=m;i++){
scanf("%d%d",&l,&r);
f[l][r]=sqrt((double)o(x[l]-x[r])+(double)o(y[l]-y[r]));//勾股定理
f[r][l]=f[l][r];
} scanf("%d%d",&l,&r);
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (f[i][j]>f[i][k]+f[k][j]) f[i][j]=f[i][k]+f[k][j];//floyd
printf("%.2lf",f[l][r]);
}
然后就是Dijkstra
(我不会告诉你我不会拼的)
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int o(int t){return t*t;}
int n,m,x[102],y[102],l,r;
double f[102][102],low[102];bool b[102];
int main(){
scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
for (int i=0;i<=n+1;i++) for (int j=0;j<=n+1;j++) f[i][j]=0x7fffffff;
scanf("%d",&m);for (int i=1;i<=m;i++){
scanf("%d%d",&l,&r);
f[r][l]=f[l][r]=sqrt((double)o(x[l]-x[r])+(double)o(y[l]-y[r]));
} scanf("%d%d",&l,&r); b[l]=1;
for (int i=1;i<=n;i++) low[i]=f[l][i]; //到第i个点的最短距离
low[l]=0;
for (int i=1;i<n;i++){
double minx=2147483647; int k=0;
for (int j=1;j<=n;j++)
if (!b[j]&&low[j]<minx){minx=low[j];k=j;}//找最小的
if (k==0) break; b[k]=1;
for (int j=1;j<=n;j++) if (low[k]+f[k][j]<low[j]) low[j]=low[k]+f[k][j];//更新
}
printf("%.2lf",low[r]);
}