题目链接:http://poj.org/problem?id=2253
题意:
求:所有到达目的地路径中边权值最大的集合中 最小的那个值
换句话说 就是求最短路径中出现的最大权值.
只需要更改dijkstra的更新条件:
/*
最短路中的最长边
改变更新条件
原来:
if(!vis[j]&&dis[j]>dis[pos]+G[pos][j])
dis[j]=dis[pos]+G[pos][j];
改为
if(!vis[j]&&dis[j]>max(dis[pos],G[pos][j]))
dis[j]=max(dis[pos],G[pos][j]);
此时,dis[]存的是到达第k个数的最长边的最小值
*/
/*
最短路中的最长边
改变更新条件
原来:
if(!vis[j]&&dis[j]>dis[pos]+G[pos][j])
dis[j]=dis[pos]+G[pos][j];
改为
if(!vis[j]&&dis[j]>max(dis[pos],G[pos][j]))
dis[j]=max(dis[pos],G[pos][j]);
此时,dis[]存的是到达第k个数的最长边的最小值
*/
#include<cstdio>
#include<cmath>
#define INF 1000000000
const int N=201;
struct node
{
double x,y;
int i;
};
double max(double a,double b){return a>b?a:b;}
node f[N];
double G[N][N];
double low[N];
void calc(const node &a,const node &b){
double dis=sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
G[a.i][b.i]=G[b.i][a.i]=dis;
}
double dijkstra(int s,int e,int n)
{
double dis[N];
bool vis[N]={0};
int pos=0,i,j;
double minn;
for(int i=0;i<n;++i)
dis[i]=G[pos][i];
vis[pos]=true;
dis[s]=0;
for(i=1;i<n;++i){
for(minn=INF,j=0;j<n;++j){
if(!vis[j]&&dis[j]<minn){
minn=dis[j];
pos=j;
}
}
vis[pos]=true;
for(j=0;j<n;++j)if(!vis[j]){
if(dis[j]>max(G[pos][j],dis[pos])){
dis[j]=max(G[pos][j],dis[pos]);
}
}
//printf("dis[0]:%lf dis[1]:%lf dis[2]=%lf\n",dis[0],dis[1],dis[2]);
}
return dis[e];
}
int main()
{
int n,cnt=0;
while(scanf("%d",&n),n){
for(int i=0;i<n;++i){
scanf("%lf %lf",
&f[i].x,&f[i].y);
f[i].i=i;
}
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
G[i][j]=INF;
for(int j=0;j<n;++j)
for(int i=j+1;i<n;++i){
calc(f[j],f[i]);
}
double ans=dijkstra(0,1,n);
++cnt;
printf("Scenario #%d\n",cnt);
printf("Frog Distance = %.3lf\n\n",ans);
}
}