题意:
求坐标上任意两点的最短距离。
思路:
这题是最短路,所以我们可以用floyd或者dijkstra算法。
代码:
//floyd算法:
#include<cstdio>
#include<cmath>
#include<cstring>
int n,x,y,e,zb[101][3],a,b;
double jl[101][101];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&zb[i][1],&zb[i][2]);
scanf("%d",&e);
memset(jl,0x7f,sizeof(jl));
for (int i=1;i<=e;i++)
{
scanf("%d%d",&x,&y);
jl[x][y]=sqrt(pow(double(zb[x][1]-zb[y][1]),2)+pow(double(zb[x][2]-zb[y][2]),2));//利用数学公式求出两个连通点的最短距离
jl[y][x]=jl[x][y];
}
scanf("%d%d",&a,&b);
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (jl[i][k]+jl[k][j]<jl[i][j]&&i!=j&&j!=k&&k!=i) jl[i][j]=jl[i][k]+jl[k][j];//这里就是floyd算法,更新每2个点之间的最短距离
printf("%.2lf",jl[a][b]);
}
//dijkstra算法:
#include<cstdio>
#include<cmath>
#include<cstring>
int k,n,x,y,m,zb[101][3],s,e,min1;
double f[101][101],c[101];
bool b[101];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&zb[i][1],&zb[i][2]);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
f[i][j]=2100000000;
scanf("%d",&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
f[x][y]=sqrt(pow(double(zb[x][1]-zb[y][1]),2)+pow(double(zb[x][2]-zb[y][2]),2));//利用数学公式求出两个连通点的最短距离
f[y][x]=f[x][y];
}
scanf("%d%d",&s,&e);
for (int i=1;i<=n;i++) c[i]=f[s][i];//c[i]表示从起点到i点的最短距离
memset(b,false,sizeof(b));
b[s]=true;c[s]=0;
for (int i=1;i<=n-1;i++)
{
min1=2100000000;
k=0;
for (int j=1;j<=n;j++)
if (!b[j]&&c[j]<min1)//找到一个最短的且没被找过的
{
min1=c[j];
k=j;
}
if (k==0) break;
b[k]=true;
for (int j=1;j<=n;j++)
if (c[k]+f[k][j]<c[j])
c[j]=c[k]+f[k][j];//更新最短距离
}
printf("%.2lf",c[e]);
}