//11108024 c00h00g 2253 Accepted 720K 0MS G++ 1360B 2012-12-14 11:50:30
//输出lf会wa
//题意:从起点到终点会有很多路径,每条路径上的边有一个最大值,求这些最大值中的最小值
//算法过程,每次寻找最小的d值,然后如果d[j]>max(d[v],mat[v][j]),则更新d[j]=max(d[v],mat[v][j])
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
double mat[205][205];
struct Node{
int x,y;
};
Node stone[205];
int n;
double d[205];
int vis[205];
int cases=0;
int main(){
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
cases++;
for(int i=0;i<n;i++)
scanf("%d%d",&stone[i].x,&stone[i].y);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
mat[i][j]=sqrt((stone[i].x-stone[j].x)*(stone[i].x-stone[j].x)+(stone[i].y-stone[j].y)*(stone[i].y-stone[j].y));
}
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
d[i]=mat[0][i];
vis[0]=1;
for(int i=0;i<n-2;i++){
//查找最小值
double minF=999999999;
int v=-1;
for(int j=1;j<n;j++){
if(d[j]<minF&&vis[j]==0){
minF=d[j];
v=j;
}
}
vis[v]=1;
for(int j=1;j<n;j++){
if(vis[j]==0&&d[j]>max(d[v],mat[v][j])){
d[j]=max(d[v],mat[v][j]);
}
}
}
printf("Scenario #%d\n",cases);
printf("Frog Distance = %.3f\n\n",d[1]);
}
}
POJ 2253 最短路径变形
最新推荐文章于 2019-08-09 08:05:00 发布