#include <stdio.h>
#include <math.h>
#define N 201
#define MAX 99999999
#define sqr(a) ((a)*(a))
struct position
{
int x, y;
} pos[N];
int map[N][N], d[N];
int prim(int v,int n){
int i,j,k,min,max=0;
for(i=0;i<n;i++)
d[i]=map[v][i];
d[v]=0;//标志加入最小生成树里
for(i=1;i<n;i++){//最多再加n-1个顶点
min=MAX;
for(j=0;j<n;j++)//找到最小的
if(d[j]>0&&d[j]<min){
min=d[j];
k=j;//做标记
}
//对当前生成的边的权值和max比较
if (max < d[k])
max = d[k];//返回所求的值(权值里最大的)
if (k == 1) //生成树包含了2号以后就可以结束Prim了
break;
d[k] = 0;//加入到最小生成树里
for (j = 0; j < n; j++)//改变权值
if (map[k][j] < d[j])
d[j] = map[k][j];
}
return max;
}
int main(void)
{
int n, i, j, t = 1;
while (scanf("%d", &n) && n)
{
for (i = 0; i < n; i++)
scanf("%d %d", &pos[i].x, &pos[i].y);
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
{
map[i][j] = sqr(pos[j].x - pos[i].x) + sqr(pos[j].y - pos[i].y);
map[j][i] = map[i][j];
}
printf("Scenario #%d\nFrog Distance = %.3lf\n\n", t++, sqrt((double)prim(0, n)));
}
return 0;
}
PoJ 2253 Prim 最小生成树
最新推荐文章于 2017-10-03 15:10:45 发布