[cpp]
/*注意細節。memset裡面的0x7f和常數賦值的0x7f差別很大。常數賦值的數值很小。而memset內部是按照字節進行賦值。是一個很大的值。
這一道題是一道最短路的變種。實際上是求所有路徑中最大邊的最小值。
起點是1,終點為2.*/
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
double dist[201];
double map[201][201];
bool vis[201];
struct point
{
double x,y;
};
point p[201];
double dis(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
int n;
int ca=1;
while(scanf("%d",&n)==1&&n)
{
for(int i=1;i<=n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
memset(vis,false,sizeof(vis));
memset(dist,0x7f,sizeof(dist));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=map[j][i]=dis(p[i],p[j]);
dist[1]=0;
for(int i=1;i<=n;i++)
{ www.2cto.com
double minn=0x7f7f7f7f;
int k;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dist[j]<minn)
{
k=j;
minn=dist[j];
}
}
vis[k]=true;
for(int j=1;j<=n;j++)
dist[j]=min(dist[j],max(dist[k],map[k][j]));
}
printf("Scenario #%d\n",ca++);
printf("Frog Distance = %.3lf\n",dist[2]);
printf("\n");
}
return 0;
}