有两只青蛙,分别在第 1,2,个位子上,其他的位子都是石头,现在青蛙 1 出发找 2,但是他的体力有限,所以要求你寻找一条路径,使得能够到达 2 号点 且 相邻的两块石头的最大距离尽可能的短
将 d 数组表示为从原点 1 到达任意一点 i 的中间任意两块石头的最大距离的最小值
const int N=200+5;
int n,m,t;
int i,j,k;
double d[N];//源点到任一点 i 的最长距离
double f[N][N];
bool vis[N];
int x[N],y[N];
double dis(int a,int b)
{
double xx=x[a]-x[b];
double yy=y[a]-y[b];
return sqrt(xx*xx+yy*yy);
}
void Dijkstra(int s)
{
for(int i=1;i<=n;i++){
d[i]=f[s][i];
vis[i]=0;
}
for(int i=1;i<=n;i++){
int tag=-1;
double minn=inf*1.0;
for(int j=1;j<=n;j++){
if(!vis[j] && minn>d[j]){
tag=j;
minn=d[j];
}
}
if(tag==-1) continue;
vis[tag]=1;
for(int j=1;j<=n;j++){
double maxx=max(d[tag],f[tag][j]);
if(maxx<d[j]) d[j]=maxx;
}
}
}
int main()
{
//IOS;
int num=0;
while(sd(n)==1){
if(n==0) break;
for(i=1;i<=n;i++) sdd(x[i],y[i]);
for(i=1;i<=n;i++){
for(j=i;j<=n;j++){
if(i==j) f[i][j]=f[j][i]=0;
else f[i][j]=f[j][i]=dis(i,j);
}
}
Dijkstra(1);
printf("Scenario #%d\nFrog Distance = %.3f\n\n",++num,d[2]);
}
//PAUSE;
return 0;
}