题目:
http://blog.csdn.net/qq_35786326/article/details/79048616
题意:
求两点间的最短距离为多少
分析:
该题目的距离为直线距离,所以就需要用到勾股定理,而其他的即可按照Dijkstra或者是Floyd两种算法。
我这边主要讲前者。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
int x[101][2],t[101]; double z[101][101],p[101];
int main()
{
int n,m,a,b;
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
z[i][j]=1e30;
for(int i=1;i<=n;i++) x[i][0]=read(),x[i][1]=read();
m=read();
for(int i=1;i<=m;i++)
{
a=read();b=read();
z[a][b]=z[b][a]=(double)sqrt(fabs(x[a][0]-x[b][0])*fabs(x[a][0]-x[b][0])+fabs(x[a][1]-x[b][1])*fabs(x[a][1]-x[b][1]));//勾股定理求距离
}
a=read();b=read();
t[a]=1;//初始值
double l;
for(int i=1;i<=n;i++) if(z[a][i]>0) p[i]=z[a][i];
p[a]=0;
int k;
for(int i=1;i<=n-1;i++)
{
l=1e30;
k=0;
for(int j=1;j<=n;j++)
if(t[j]==0&&p[j]<l) l=p[j],k=j;
if(k==0) break;//k记录当前要加入的编号,l纪录当前要加入的值
t[k]=1;
for(int j=1;j<=n;j++)
if(p[k]+z[k][j]<p[j]) p[j]=p[k]+z[k][j];//p数组进行统计
}
printf("%.2lf",p[b]);//输出
return 0;
}