题目传送门

题意:给出n个三维空间的球体,球体是以圆心坐标+半径来表示的,要求在球面上建桥使所有的球联通,求联通所建桥的最小长度。

分析:若两点距离大于两半径和的长度,那么距离就是两点距离 - 半径和,否则为0,Prim写错了,算法没有完全理解

/************************************************
* Author        :Running_Time
* Created Time  :2015/10/25 12:00:48
* File Name     :POJ_2031.cpp************************************************/#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e2 + 10;
const int E = N * N;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-10;bool vis[N];
double d[N];
int head[N];
int n, m, e;
int dcmp(double x)  {       //三态函数,减少精度问题 if (fabs (x) < EPS) return 0; else    return x < 0 ? -1 : 1;
}
struct Point    {double x, y, z, a;Point () {}Point (double x, double y, double z, double a) : x (x), y (y), z (z), a (a) {}Point operator - (const Point &r) const {       //向量减法 return Point (x - r.x, y - r.y, z - r.z, 0); }
};
typedef Point Vector;       //向量的定义
Point read_point(void)   {      //点的读入 double x, y, z, r; scanf ("%lf%lf%lf%lf", &x, &y, &z, &r); return Point (x, y, z, r);
}
double dot(Vector A, Vector B)  {       //向量点积 return A.x * B.x + A.y * B.y + A.z * B.z;
}
double length(Vector A) {       //向量长度,点积 return sqrt (dot (A, A));
} struct Edge {int v, nex;double w;Edge () {}Edge (int v, double w, int nex) : v (v), w (w), nex (nex) {}bool operator < (const Edge &r) const   {return w > r.w;}
}edge[E];void init(void) {memset (head, -1, sizeof (head));e = 0;
}void add_edge(int u, int v, double w)   {edge[e] = Edge (v, w, head[u]);head[u] = e++;
}double Prim(int s) {memset (vis, false, sizeof (vis));for (int i=0; i<n; ++i) d[i] = 1e9;priority_queue<Edge> Q;for (int i=head[s]; ~i; i=edge[i].nex)  {int v = edge[i].v;  double w = edge[i].w;if (d[v] > w)   {d[v] = w;   Q.push (Edge (v, d[v], 0));}}vis[s] = true;  d[s] = 0;double ret = 0;while (!Q.empty ()) {int u = Q.top ().v; Q.pop ();if (vis[u]) continue;vis[u] = true;  ret += d[u];for (int i=head[u]; ~i; i=edge[i].nex)  {int v = edge[i].v;  double w = edge[i].w;if (!vis[v] && d[v] > w)   {d[v] = w;    Q.push (Edge (v, d[v], 0));}}}return ret;
}Point p[N];
int main(void)    {while (scanf ("%d", &n) == 1)   {if (!n) break;for (int i=0; i<n; ++i) {p[i] = read_point ();}init ();for (int i=0; i<n; ++i) {for (int j=i+1; j<n; ++j)   {double dis = length (p[i] - p[j]);double len = p[i].a + p[j].a;if (dcmp (dis - len) <= 0)   {add_edge (i, j, 0);add_edge (j, i, 0);}else    {add_edge (i, j, dis - len);add_edge (j, i, dis - len);}}}printf ("%.3f\n", Prim (0));}return 0;
}

转载于:https://www.cnblogs.com/Running-Time/p/4908682.html

Prim POJ 2031 Building a Space Station相关推荐

  1. POJ - 2031 Building a Space Station (最小生成树)

    题目链接:http://poj.org/problem?id=2031点击打开链接 Building a Space Station Time Limit: 1000MS   Memory Limit ...

  2. POJ 2031 Building a Space Station

    题目链接:http://poj.org/problem?id=2031 题目意思是给出三维坐标系上的一些球的球心坐标和其半径,搭建通路,使得他们能够相互连通.如果两个球有重叠的部分则算为已连通,无需再 ...

  3. zoj 1718 poj 2031 Building a Space Station

    最小生成树,用了Kruskal算法.POJ上C++能过,G++不能过... 算出每两个圆心之间的距离,如果距离小于两半径之和,那么这两个圆心之间的距离直接等于0,否则等于距离-R[i]-R[j]. # ...

  4. pku 2031 Building a Space Station 最小生成树+精度控制

    http://poj.org/problem?id=2031 题意就是给你n个球的(球心以及半径),然后求最小生成树就欧了,这里的关键部分是对于重复的球的路径长度的处理 #include <io ...

  5. POJ_2031 Building a Space Station

    Building a Space Station 链接 POJ_2031 Building a Space Station Describe You are a member of the space ...

  6. poj2031 Building a Space Station

    题目链接:http://poj.org/problem?id=2031 题意:给你n个球,让你用最小的花费,把这n个球联通,如果两个球相交,就默认联通,否者连接这两个球的花费就是,球面之间的最短距离, ...

  7. I. Space Station(hash记忆化+dp)

    <文章>陆游 文章本天成,妙手偶得之. 粹然无疵瑕,岂复须人为. 君看古彝器,巧拙两无施. 汉最近先秦,固已殊淳漓. 胡部何为者,豪竹杂哀丝. 后夔不复作,千载谁与期? I. Space ...

  8. HDU 1815, POJ 2749 Building roads(2-sat)

    HDU 1815, POJ 2749 Building roads 题目链接HDU 题目链接POJ 题意: 有n个牛棚, 还有两个中转站S1和S2, S1和S2用一条路连接起来. 为了使得随意牛棚两个 ...

  9. 【POJ 1788 --- Building a New Depot】

    [POJ 1788 --- Building a New Depot] Description Advanced Cargo Movement, Ltd. is successfully expand ...

  10. Building a Space Station--POJ 2031

    1.题目类型:计算几何,最小生成树. 2.解题思路:(1)获得所有点路径长度的矩阵map[][]:(2)利用Prim算法求解最小生成树. 3.注意事项:数学操作,中间值全部用double保存. 4.实 ...

最新文章

  1. CCF - 201509-2 - 日期计算
  2. c++ lambda基本语法
  3. Maven入门基础-环境篇
  4. 11 国股市熔断,“祸及”程序员?!
  5. commit分拆多个 git_git如何合并只有两个commit到一个?
  6. Whitebox 白盒--密码算法的安全工具
  7. 微观、宏观、精准 多视角估算数据库性能(选型、做预算不求人)
  8. Word2010为图片批量插入题注
  9. 跟着团子学SAP PS:项目模版搭建 CJ91/CJ92/CJ93/CN01/CN02/CN03/CN11/CN12/CN13
  10. cocos2dx之音效引擎
  11. Android_APP 微信支付接口开发
  12. duet二重奏hp_《二重奏》Duet
  13. 2021东三省数学建模竞赛a题
  14. .NET 对于构建系统应用的探索历程
  15. AI 图片截取、ffmpeg使用及安装, anaconda环境,图片标注(labelme),模型训练(yolov5),CUDA+Pytorch安装及版本相关问题
  16. Intel 快速存储蓝屏
  17. 基于51单片机的水塔水箱液水位监测控制系统无线WIFI报警
  18. TestNG框架自动化简述
  19. Excel怎样提取相同内容对应的多个数据 按条件提数值
  20. React + ant-design实现文件下载

热门文章

  1. 中空格的asc码表_Excel怎么快速提取混合单元格中的中文、英文、数字?
  2. 单板计算机图片大全,最强单板计算机UP Board之Windows10完全版、Ubuntu、Andriod系统体验 | 爱板网...
  3. java 性能优化分析工具_【java】JVM性能调优监控工具、可视化在线内存分析工具...
  4. 机器学习- 吴恩达Andrew Ng - week3-1 Classification
  5. 算法:获取链表的中间值Middle of the Linked List
  6. DSSM核心思想是把查询文本(query)和内容文本(doc)映射到同维度的语义空间中, 以最优化查询文本和内容文本的语义向量之间的余弦相似度为目的
  7. LeetCode Array 最长回文子串-数组和string题目
  8. Nesterov Momentum牛顿动量法
  9. Python sys.path、sys.modules模块介绍
  10. android版git中国只有,GitHub - ynztlxdeai/android-app: 本项目已经迁移到 git.oschina.net ,此处不再更新!...