本题还依旧是dij算法来做,但再进行松弛操作时,有一点变化,计算最小最大路,dis[j]=min(dis[j],max(dis[u],g[u][j]);
下面见ac代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=2000+20;
const double INF=1000000000.0;
double v[maxn][maxn],dis[maxn],vis[maxn];
int x[maxn],y[maxn];
int n;
void dij(int x)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
dis[i]=v[x][i];
dis[x]=0;vis[x]=1;
for(int i=1;i<n;i++)
{
double sum=INF;int u=-1;
for(int j=1;j<=n;j++)
if(!vis[j]&&dis[j]<=sum)
{
sum=dis[u=j];
}
vis[u]=1;
for(int j=1;j<=n;j++)
dis[j]=min(dis[j],max(dis[u],v[u][j]));
}
}
int main()
{
//freopen("B.txt","r",stdin);
int cnt=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n;i++)
{
scanf("%d %d",&x[i],&y[i]);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i!=j)
v[i][j]=sqrt((double)((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));
else
v[i][j]=0;
}
dij(1);
if(cnt!=0)
printf("\n");
printf("Scenario #%d\n",++cnt);
printf("Frog Distance = %.3f\n",dis[2]);
}
return 0;
}