题目链接: http://poj.org/problem?id=2253
题意:找到a到b的一条路径使得该路径的最大步长最小。prim算法,只是当树可以到达b点时结束。(之前做过的题目好久没练好生疏)
#include<cstdio>
#include<cmath>
using namespace std;
const int num=205;
const int inf=0x7fffffff;
int n;
double map[num][num],dis[num],ans,vis[num];
struct node
{
int x,y;
}data[num];
double qdis(node a,node b)
{
double dx,dy;
dx=a.x-b.x;
dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
void prim(int st,int ed)
{
int i,j,temp,tm;
double tv;
ans=0;
for(i=0;i<n;i++)
{
vis[i]=0;
dis[i]=map[st][i];
}
vis[st]=1;
for(i=1;i<n;i++)
{
tv=inf;
for(j=0;j<n;j++)
{
if(vis[j]==0&&dis[j]<tv)
{
tv=dis[j];
tm=j;
}
}
vis[tm]=1;
if(tv>ans)
ans=tv;
if(tm==ed)
break;
for(j=0;j<n;j++)
if(vis[j]==0&&map[tm][j]<dis[j])
dis[j]=map[tm][j];
}
}
int main()
{
int t=0,i,j;
double s;
freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
t++;
for(i=0;i<n;i++)
{
scanf("%d%d",&data[i].x,&data[i].y);
for(j=0;j<i;j++)
{
s=qdis(data[i],data[j]);
map[i][j]=map[j][i]=s;
}
map[i][i]=0;
}
prim(0,1);
printf("Scenario #%d\n",t);
printf("Frog Distance = %.3f\n\n",ans);
}
return 0;
}