标签:
Description
Input
Output
Sample Input
2 0 0 3 4 3 17 4 19 4 18 5 0
Sample Output
Scenario #1 Frog Distance = 5.000 Scenario #2 Frog Distance = 1.414
题目大意:青蛙从A点跳到B点的所有路径中最长边的最小值(也就是哪一条通路里面的最长边相对其他通路中的最长边最小),也可以说成是最小生成树里
面的最大边。输出此最小值即可。
思路:题目就是求最小生成树中的最大边,即prim算法的灵活运用。就是在求最小生成树的过程当中,不断地去比较最小生成树的各边,当达到B点时就结
束查找
代码如下:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
double a[200][2];
double lowcost[200],closet[200];
double map[200][200];
int main()
{
int n;
int k=1;
while(cin>>n,n)
{
int i,j;
for (i = 0 ;i < n ; i++ )
cin>>a[i][0]>>a[i][1];
memset(lowcost,0,sizeof(lowcost));
for ( i = 0 ; i < n ; i ++ )
{
for ( j = 0 ; j < n ; j ++ )
{
map[i][j]=1.0*sqrt(pow(1.0*abs(a[i][0]-a[j][0]),2)+pow(1.0*abs(a[i][1]-a[j][1]),2));
}
}
double ans=0.0;
for ( i = 0 ; i< n ; i++ )//先以点A为起点,将各点到A点的距离记录下来。
{
lowcost[i]=map[0][i];
closet[i]=0;
}
for ( i = 0 ; i < n - 1 ; i ++ )
{
double mindis=1.0*(1<<20);
int minone;
for ( j = 0 ; j < n ; j ++ )
{
if(lowcost[j]&&mindis>lowcost[j]) //找到最短的边作为最小生成树的一部分
{
mindis=lowcost[j];
minone=j;
}
}
if(ans<mindis)
ans=mindis;
lowcost[minone]=0.0;
if(minone==1) //到达B点即可结束,输出ans
break;
for ( j = 0 ; j < n ; j ++ )
{
if(map[j][minone]<lowcost[j]) //用来更新数组,保留值较小的