poj 2253 Frogger

#include <iostream>            //prime算法的变形,求一条路径,使得它的最大边达到最小值
#include<cmath>
using namespace std;
int loc[205][2],edge[205][205],n,t,i,j,k;
const int MaxWeight=3000000;
struct Mintree
{
int end,weight; //没有必要记录起点
}mintree[205],e;
void Prim()
{
int min,v,com;
for(i=0;i<n-1;++i) //求n-1条边
{
min
=MaxWeight;
for(j=i;j<n-1;++j)
{
if(mintree[j].weight<min) //求最小权值边
{
min
=mintree[j].weight;k=j;
}
}
swap(mintree[k],mintree[i]);
//最小边移至前端
v=mintree[i].end;
if(v==1) //找到终点
{
printf(
"Scenario #%d\nFrog Distance = %.3lf\n\n",++t,sqrt(mintree[i].weight+0.0));
return ;
}
for(j=i+1;j<n-1;++j) //更新后面的边
{
com
=max(mintree[i].weight,edge[v][mintree[j].end]); //prime算法的变形, 注意不是 com=edge[v][mintree[j].end];
//求最短路径的最大边
if(com<mintree[j].weight)
{
mintree[j].weight
=com;
}
}
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
for(i=0;i<n;++i) //顶点下标从0开始
scanf("%d%d",&loc[i][0],&loc[i][1]);
for(i=0;i<n;++i)
for(j=0;j<n;++j)
{
edge[i][j]
=pow((loc[i][0]-loc[j][0])+0.0,2.0)+pow((loc[i][1]-loc[j][1])+0.0,2.0);
}
for(i=0;i<n-1;++i) //一共有n-1条边,下标从0开始, mintree[0].begin=0,mintree[0].end=1;
{
mintree[i].end
=i+1;
mintree[i].weight
=edge[0][i+1];
}
Prim();
}
return 0;
}

  

posted on 2011-07-22 16:32  sysu_mjc  阅读(136)  评论(0编辑  收藏  举报

导航