思路:floyd算法
注意:if的判断是 设dist(A->B)已知,若加入一点U,且dist(A->U)>dist(U->B),则若dist(A->U)<dist(A->B),则更新dist(A->B)
#include<iostream>
#include<iomanip>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 201
struct Point{
double x;
double y;
};
double map[N][N];
Point stones[N];
int main()
{
int i,j,k,n;
int cases=0;
while(cin>>n && n!=0)
{
memset(stones,0,sizeof(stones));
for(i=1;i<=n;i++)
{
cin>>stones[i].x>>stones[i].y;
}
//constrcut map
for(i=1;i<=n;i++)
{
for(j=i;j<=n;j++)
{
map[i][j]=map[j][i]=sqrt((stones[i].x-stones[j].x)*(stones[i].x-stones[j].x)+(stones[i].y-stones[j].y)*(stones[i].y-stones[j].y));
}
}
//floyd algorithm
double temp=0;
for(k=1;k<=n;k++)//中间跳转点
{
for(i=1;i<=n;i++)//对每一对[i,j]考虑加入中间跳转点k后的选择
{
for(j=1;j<=n;j++)
{
map[i][j]=min(map[i][j],max(map[i][k],map[k][j]));//关键所在
}
}
}
//output
cout<<setprecision(3)<<fixed;
cout<<"Scenario #"<<++cases<<endl;
cout<<"Frog Distance = "<<map[1][2]<<endl<<endl;
}
//system("pause");
return 0;
}