Building a Space Station--POJ 2031

1、题目类型:计算几何,最小生成树。

2、解题思路:(1)获得所有点路径长度的矩阵map[][];(2)利用Prim算法求解最小生成树。

3、注意事项:数学操作,中间值全部用double保存。

4、实现方法:

 
  
#include < iostream >
#include
< cmath >
#include
< algorithm >
#define _Max 10000000
#define _Min 0.00000000001
using namespace std;

struct Node
{
double x,y,z;
double r;
};

Node Arr[
101 ];
int n;
double map[ 101 ][ 101 ],dis[ 101 ],ans;
bool visted[ 101 ];

double Lengh(Node A,Node B)
{
double x = (A.x - B.x) * (A.x - B.x);
double y = (A.y - B.y) * (A.y - B.y);
double z = (A.z - B.z) * (A.z - B.z);
if ((sqrt(x + y + z) - A.r - B.r) > _Min)
return sqrt(x + y + z) - A.r - B.r;
else
return 0 ;
}

void Init()
{
for ( int i = 1 ;i <= n;i ++ )
cin
>> Arr[i].x >> Arr[i].y >> Arr[i].z >> Arr[i].r;
for ( int j = 1 ;j <= n;j ++ )
for ( int k = j;k <= n;k ++ )
map[j][k]
= map[k][j] = Lengh(Arr[j],Arr[k]);
ans
= 0.0 ;
}

void Prim()
{
int i,j;
memset(visted,
0 , sizeof (visted));
for (i = 1 ;i <= n;i ++ )
dis[i]
= map[ 1 ][i];
visted[
1 ] = 1 ;
dis[
1 ] = _Max;
for (i = 1 ;i < n;i ++ )
{
int pos = min_element(dis + 1 ,dis + n + 1 ) - dis;
ans
+= dis[pos];
visted[pos]
= 1 ;
dis[pos]
= _Max;
for (j = 1 ;j <= n;j ++ )
{
if (dis[j] > map[pos][j] &&! visted[j])
dis[j]
= map[pos][j];
}
}
}

int main()
{
while (cin >> n && n)
{
Init();
Prim();
printf(
" %.3f\n " ,ans);
}
return 0 ;
}

 

转载于:https://www.cnblogs.com/yongze103/archive/2010/07/29/1788013.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值