挺简单的一个题,简单的dijsktra变形,只要将更新时的方程变一下就可以了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <math.h>
using namespace std;
#define maxint 99999999
struct Node
{
double x,y;
}node[210];
int sx,sy,ex,ey,n;
double mapp[210][210];
double dist[210];
int s[210];
void dijkstra()
{
int i,j,u;
for(i=1;i<n;i++){
dist[i]=mapp[0][i];
s[i]=0;
}
dist[0]=0;
s[0]=1;
for(i=1;i<n;i++)
{
double tmp=maxint;
u=0;
for(j=1;j<n;j++)
if(!s[j]&&dist[j]<tmp)
{
u=j;tmp=dist[j];
}
s[u]=1;
for(j=1;j<n;j++)
if(!s[j]&&mapp[u][j]<maxint)
{
double newdist=max(dist[u],mapp[u][j]);
if(newdist<dist[j])
{
dist[j]=newdist;
}
}
}
}
int main()
{
int i,j,t=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
printf("Scenario #%d\n",++t);
for(i=0;i<n;i++)
scanf("%lf%lf",&node[i].x,&node[i].y);
sx=node[0].x; sy=node[0].y;
ex=node[1].x; ey=node[1].y;
memset(mapp,maxint,sizeof(mapp));
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
mapp[i][j]=mapp[j][i]=sqrt((node[i].x-node[j].x)*(node[i].x-node[j].x)+(node[i].y-node[j].y)*(node[i].y-node[j].y));
dijkstra();
printf("Frog Distance = %.3lf\n\n",dist[1]);
}
return 0;
}