题意:
从1号点,到2号点,找一条能通过的路,使得这条路中的最大的边,比其它所有可能的路中的边都小。


#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
const int N = 200;
const double oo = 200000000.0;
struct Point{
int x,y;
};
Point p[N];
double g[N][N],maxstep[N];
bool ok[N];
int n;
double cal(const Point &p1,const Point &p2){
double dist;
dist=sqrt((double)((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)));
return dist;
}
int getmin(){
double minv=oo;
int k;
for (int i=1;i<=n;i++)
if (!ok[i]&&maxstep[i]<minv){
minv=maxstep[k=i];
}
return k;
}
void solve(int begin,int end){
for (int i=1;i<=n;i++) maxstep[i]=g[begin][i];
maxstep[begin]=0;
fill(ok,ok+N,false);
ok[begin]=true;
for (int i=1;i<n;i++){
int k=getmin();
ok[k]=true;
if (k==end) return;
for (int j=1;j<=n;j++)
if (!ok[j]&&max(maxstep[k],g[k][j])<maxstep[j]){
maxstep[j]=max(maxstep[k],g[k][j]);
}
}
}
int main(){
int c(0);
while (scanf("%d",&n)==1&&n){
for (int i=1;i<=n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
fill(g[0],g[0]+N*N,oo);
for (int i=1;i<=n;i++) g[i][i]=0.0;
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
g[i][j]=g[j][i]=cal(p[i],p[j]);
solve(1,2);
c++;
printf("Scenario #%d\n",c);
printf("Frog Distance = %.3f\n\n",maxstep[2]); //注意此处不能用%.3lf
}
return 0;
}
posted on 2015-09-02 11:58
龙在江湖 阅读(132)
评论(0) 编辑 收藏 引用 所属分类:
图论 、
数据结构