题意:求1到2所有路径中最小蛙跳 蛙跳:在一条路径中所有蛙跳中的最大蛙跳
思路:dijska算法思想
#include<iostream>
#include<cmath>
using namespace std;
struct Node
{
double x,y;
}node[222];
double dist[222];
int s[222];
int n;
int cas;
double e(Node a,Node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double max(double x,double y)
{
if(x>y) return x;
return y;
}
void Dijsc()
{
int i,j,v;
memset(s,0,sizeof(s));
for(i=1;i<=n;i++)
dist[i]=e(node[1],node[i]);
s[1]=1;
for(i=1;i<=n;i++)
{
v=-1;
double min=999999999;
for(j=2;j<=n;j++)
{
if(dist[j]<min&&!s[j]) //每次选择最小蛙跳 向外扩展 所选择的这个蛙跳肯定是最小的 也就是最优的
v=j,min=dist[j];
}
if(v==-1) break;s[v]=1;
for(j=2;j<=n;j++)//通过最小的蛙跳向外扩展
{
if((dist[j]>dist[v])&&(dist[j]>e(node[v],node[j])))
dist[j]=max(dist[v],e(node[v],node[j]));
}
}
printf("Scenario #%d\n",cas);
printf("Frog Distance = %.3f\n\n",dist[2]);
}
int main()
{
int i;
cas=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
cas++;
for(i=1;i<=n;i++)
scanf("%lf%lf",&node[i].x,&node[i].y);
Dijsc();
}
return 0;
}