Building a Space Station(bfs)
2024-09-08 00:21:10
http://poj.org/problem?id=2031
题意:给出n个球的圆心坐标x,y,z, 半径r,若任意两球不相交,则在两球间建桥。问需建桥的最短距离是多少。
思路:建图,以两球间相差的距离为权值,然后求最小生成树。
#include <stdio.h>
#include <math.h>
#include <string.h>
const int inf=<<;
const double eps=1e-;
const int maxn=;
double sum,Map[maxn][maxn],dis[maxn];
int vis[maxn];
struct point
{
double x,y,z,r;
};
void prim(int n)
{
for (int i = ; i <= n; i++)
dis[i]=inf;
dis[]=;
sum=;
for (int i = ; i <= n; i++)
{
double Min=inf;
int pos=;
for (int j = ; j <= n; j++)
{
if (!vis[j]&&dis[j] < Min)
{
Min = dis[j];
pos = j;
}
}
if (Min==inf)
return;
vis[pos] = ;
sum+=Min;
for (int j = ; j <= n; j++)
{
if (!vis[j]&&dis[j] > Map[pos][j])
dis[j] = Map[pos][j];
}
}
}
void init()
{
sum = ;
memset(vis,,sizeof(vis));
memset(Map,,sizeof(Map));
}
double dist(point &a,point &b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z);
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
point a[];
init();
for (int i = ; i <= n; i++)
{
scanf("%lf%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z,&a[i].r);
}
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
double d = sqrt(dist(a[i],a[j]));
if (d-(a[i].r+a[j].r)>eps)
Map[i][j] = d-a[i].r-a[j].r;
else
Map[i][j] = ;
}
}
prim(n);
printf("%.3f\n",sum);
}
return ;
}
最新文章
- css兼容性大坑
- Oracle创建主外键
- easy UI简单使用介绍
- Hibernate 异常 —— No CurrentSessionContext configured
- hadoop2.2.0伪分布式搭建
- 《JavaScript高级程序设计 第3版》-学习笔记-2
- 什么是JPA
- Mifare 1卡的存储结构
- Dede文章列表
- JDBC 基础概念
- ThinkPHP中 按条件查询后列表显示
- CocoaPods的安装及设置
- Data Structure(2)
- HDU5804--Price List
- jQuery Ajax post多个值传参
- 谈Ajax的Get和Post的区别
- mybatis什么时候用resulttype 什么时候用resultmap
- Android-Chart
- Storm入门(六)深入理解可靠性机制
- java基本类型的默认值
热门文章
- Linux 配置JDK + MyEclipse
- Centos 编译安装Haproxy
- Shell基本运算符
- Redis 之服务器集群配置
- 本地运行项目成功 ,但在服务器运行程序就会报Failed to establish a new connection: [Errno -2] Name or service not known
- Python 递归、匿名函数、map和filter day4
- Whl自助搜索下载器
- PHP中的几个随机数生成函数
- BUAA_OO_博客作业二
- 【 Educational Codeforces Round 51 (Rated for Div. 2) F】The Shortest Statement