题意:
三维空间里有一些球,给出球心坐标和半径,搭建通路,使得他们能够相互连通。如果两个球相交或者相切,则算已连通,无需再搭桥。求搭建通路的最小费用(费用就是边权,就是两个球面之间的距离)。

Input:
给出球的个数,各个球球心的坐标以及球半径。

Output:
求搭建通路的最小费用

思路:
通过球心坐标和半径求出两点之间的边权,求出边权后,把球看做点,用邻接矩阵存储这个无向图,用Prim求最小生成树。
(写的时候把Prim写成函数莫名其妙无法输出正确结果,莫名其妙,以后再说(已经解决

第一次的Prim

#include<iostream>
#include<string>
#include<cmath>
#include<ctype.h>
#include<memory.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<iomanip>
#include<set>
#include<list>
#include<vector>
#include<stack>
#include<queue>
#define ll long long int
using namespace std;
const int INF = 99999.0;
const int maxn = 150;
const double eps = 1e-10;struct ball
{double x, y, z, r;
};
struct edge
{int a, b;double dis;
};
int n;
double Map[maxn][maxn];
double dis[maxn];
int vis[maxn];
//double ans = 0;double pow2(double x)
{return x * x;
}
int Eps(double k)
{/*if (fabs(k) < eps)return 0;else if (k > 0)return 1;else return -1;*/if (fabs(k) < eps)return 0;return k > 0 ? 1 : -1;
}
double getdis(ball a, ball b)//计算两个球之间的距离(需要减去两个球的半径
{return sqrt(pow2(a.x - b.x) + pow2(a.y - b.y) + pow2(a.z - b.z) )- a.r - b.r;
}int main()
{int n;while (cin >> n){if (n == 0)break;//prim算法 图需要初始化for (int i = 0; i <= n; i++)for (int j = 0; j <= n; j++)Map[i][j] = i == j ? 0 : INF;ball a[maxn];//先保存数据for (int i = 0; i < n; i++)cin >> a[i].x >> a[i].y >> a[i].z >> a[i].r;//计算各个球之间的距离,作为无向图的边权for (int i = 0; i < n - 1; i++)for (int j = i + 1; j < n; j++){double dis = getdis(a[i], a[j]);if (Eps(dis) > 0)Map[i][j] = Map[j][i] = dis;else//两个球相切或相交Map[i][j] = Map[j][i] = 0;}//Primmemset(vis, 0, sizeof(vis));for (int i = 0; i < n; i++)dis[i] = Map[0][i];vis[0] = 1;for (int i = 0; i < n; i++){double Min = INF;int min_index = -1;for (int j = 0; j < n; j++){if (dis[j] < Min && !vis[j]){Min = dis[j];min_index = j;}}//ans += Min;if (min_index != -1)vis[min_index] = 1;for (int j = 0; j < n; j++){if (dis[j] > Map[min_index][j] && !vis[j])dis[j] = Map[min_index][j];}}double ans = 0;for (int i = 0; i < n; i++)ans += dis[i];printf("%.3lf\n", ans);//cout << fixed << setprecision(3) << ans << endl;}return 0;
}

第二次的Prim

//Kruskal:
//#pragma warning(disable:4996)
//#include<iostream>
//#include<string>
//#include<cmath>
//#include<ctype.h>
//#include<string.h>
//#include<algorithm>
//#include<map>
//#include<iomanip>
//#include<set>
//#include<list>
//#include<vector>
//#include<stack>
//#include<queue>
//#define ll long long int
//using namespace std;
//const int maxn = 999999;
//struct node
//{//  double x, y, z, r;
//};
//node a[maxn];
//
//struct edge
//{//  double u, v, w;
//};
//bool cmp(edge a, edge b)
//{//  return a.w < b.w;
//}
//edge b[maxn];
//int par[maxn];
//int find(int x)
//{//  if (par[x] == x)
//      return x;
//  return par[x] = find(par[x]);
//}
//
//int main()
//{//  int n;
//  while (cin >> n && n)
//  {//      for (int i = 0; i <= n; i++)
//          par[i] = i;
//
//      for (int i = 0; i < n; i++)
//          cin >> a[i].x >> a[i].y >> a[i].z >> a[i].r;
//
//      int cnt = 0;
//      for (int i = 0; i < n; i++)
//          for (int j = 0; j < n; j++)
//              if (i != j)
//              {//                  b[cnt].u = i;
//                  b[cnt].v = j;
//                  b[cnt].w = sqrt(pow(a[i].x - a[j].x, 2) + pow(a[i].y - a[j].y, 2) + pow(a[i].z - a[j].z, 2)) - a[i].r - a[j].r;
//                  if (b[cnt].w < 0)
//                      b[cnt].w = 0;
//                  cnt++;
//              }
//      sort(b, b + cnt, cmp);
//
//      double sum = 0;
//      for (int i = 0; i < cnt; i++)
//      {//          int fa = find(b[i].u);
//          int fb = find(b[i].v);
//          if (fa != fb)
//          {//              sum += b[i].w;
//              par[fa] = fb;
//          }
//      }
//      //cout << sum << endl;
//      printf("%.3f\n", sum);
//
//  }
//  return 0;
//}//Prim:
#pragma warning(disable:4996)
#include<iostream>
#include<string>
#include<cmath>
#include<ctype.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<iomanip>
#include<set>
#include<list>
#include<vector>
#include<stack>
#include<queue>
#define ll long long int
using namespace std;
const int maxn = 115;
const int INF = 9999999;
struct node
{double x, y, z, r;
};
node ball[maxn];int n;
double dis[maxn];
int vis[maxn];
double a[maxn][maxn];void prim(int s)
{for (int i = 0; i < n; i++)dis[i] = a[i][s];vis[s] = 1;for (int i = 0; i < n; i++){double Min = 999999;int min_index = -1;for (int j = 0; j < n; j++){if (Min > dis[j] && !vis[j]){Min = dis[j];min_index = j;}}if (min_index != -1)vis[min_index] = 1;for (int j = 0; j < n; j++){if (dis[j] > a[min_index][j] && !vis[j])dis[j] = a[min_index][j];}}
}int main()
{while (cin >> n && n){memset(vis, 0, sizeof(vis));memset(dis, 0, sizeof(dis));for (int i = 0; i < n; i++)cin >> ball[i].x >> ball[i].y >> ball[i].z >> ball[i].r;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++){if (i == j)a[i][j] = 0;else{a[i][j] = sqrt(pow(ball[i].x - ball[j].x, 2) + pow(ball[i].y - ball[j].y, 2) + pow(ball[i].z - ball[j].z, 2)) - ball[i].r - ball[j].r;if (a[i][j] < 0)a[i][j] = 0;}}prim(0);double ans = 0;for (int i = 0; i < n; i++)ans += dis[i];printf("%.3f\n", ans);}return 0;
}

Kruskal


#pragma warning(disable:4996)
#include<iostream>
#include<string>
#include<cmath>
#include<ctype.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<iomanip>
#include<set>
#include<list>
#include<vector>
#include<stack>
#include<queue>
#define ll long long int
using namespace std;
const int maxn = 999999;
struct node
{double x, y, z, r;
};
node a[maxn];struct edge
{double u, v, w;
};
bool cmp(edge a, edge b)
{return a.w < b.w;
}
edge b[maxn];
int par[maxn];
int find(int x)
{if (par[x] == x)return x;return par[x] = find(par[x]);
}int main()
{int n;while (cin >> n && n){for (int i = 0; i <= n; i++)par[i] = i;for (int i = 0; i < n; i++)cin >> a[i].x >> a[i].y >> a[i].z >> a[i].r;int cnt = 0;for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)if (i != j){b[cnt].u = i;b[cnt].v = j;b[cnt].w = sqrt(pow(a[i].x - a[j].x, 2) + pow(a[i].y - a[j].y, 2) + pow(a[i].z - a[j].z, 2)) - a[i].r - a[j].r;if (b[cnt].w < 0)b[cnt].w = 0;cnt++;}sort(b, b + cnt, cmp);double sum = 0;for (int i = 0; i < cnt; i++){int fa = find(b[i].u);int fb = find(b[i].v);if (fa != fb){sum += b[i].w;par[fa] = fb;}}//cout << sum << endl;printf("%.3f\n", sum);}return 0;
}

poj 2031 BuildingaSpaceStation 最小生成树 Prim、Kruskal相关推荐

  1. poj 2421 ConstructingRoads 最小生成树 Prim、Kruskal

    题意: 有n个村庄,从1到n,你应该修建一些道路,这样每两个村庄就可以互相连接.我们说两个村庄A和B是相连的,如果并且仅当在A和B之间有一条道路,或者存在一个村庄C,使得A和C之间有一条道路,并且C和 ...

  2. 数据结构实验之图论六:村村通公路(最小生成树Prim/Kruskal)

    Description 当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出 ...

  3. HDU 1233 还是畅通工程(最小生成树 Prim+Kruskal)

    原题地址 http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意:(最小生成树裸题)有N个村庄,给出村庄两两之间的距离,要求铺设公路,使得任何两个村庄间都可 ...

  4. zoj 1586 QSNetwork 最小生成树 Prim Kruskal

    题意: 一个图,不止边有权值,点也有权值 Input: 输入的第一行包含一个整数t,它指示数据集的数量. 第二行中有T个数据集. 在单个数据集中,第一行包含一个整数n,表示qs的数目. 第2行包含n个 ...

  5. poj1861 最小生成树 prim amp; kruskal

    // poj1861 最小生成树 prim & kruskal // // 一个水题,为的仅仅是回味一下模板.日后好有个照顾不是#include <cstdio> #include ...

  6. * poj 1251 JungleRoad 最小生成树 Kruskal算法、Prim算法

    文章目录 Kruskal算法 模板:https://blog.csdn.net/Rain722/article/details/65642992 Prim算法 模板: poj 1251 JungleR ...

  7. 最小生成树算法详解(prim+kruskal)

    最小生成树概念: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里 ...

  8. ReviewForJob——最小生成树(prim + kruskal)源码实现和分析

    [0]README 1)本文旨在给出 ReviewForJob--最小生成树(prim + kruskal)源码实现和分析, 还会对其用到的 技术 做介绍: 2)最小生成树是对无向图而言的:一个无向图 ...

  9. 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)

    一.基础知识   有向图   无向图 以无向图为例: 邻接矩阵: 度矩阵(对角矩阵): 二.最小生成树 应用:将网络顶点看着城市,边看着城市之间通讯网,边的权重看着成本,根据最小生成树可以构建城市之间 ...

最新文章

  1. 短视频个性化Push工程精进之路
  2. Python面向对象编程:入门类和对象
  3. 关于网站根目录下面robots.txt文件的作用
  4. vue/return-in-computed-property Enforce that a return statement is present in computed property
  5. Navicat 9.1、10.0 简体中文最新版,注册码(For Mysql)
  6. Dubbo xml配置 和注解配置 写法
  7. Android特效 五种Toast具体解释
  8. JeeWx捷微 2.4.1版本发布,开源JAVA微信管家平台(支持公众号、企业号)
  9. 我与我的CSDN博客的第一天
  10. hihoCoder - 1075 开锁魔法III
  11. 章节十五、6-log4 2-用默认的配置
  12. 基于Java Web的学生选课管理系统设计与实现
  13. html5播放倍速,[html5]html5倍速播放功能源代码实例
  14. 【小技巧】2345——劫持IE浏览器主页
  15. 详解浪潮与Odoo联手背后 双方将带来哪些化学反应?
  16. 游戏3d模型如何放到计算机中,三维建模技术在三维游戏中的应用
  17. HTML是什么?有什么作用?
  18. css动画设置运动轨迹,css3动画之圆形运动轨迹
  19. 详细介绍idm下载以及配置,实现百度网盘急速下载不是梦,适合新手
  20. python网络爬虫——自学笔记1.用requests库爬取图片

热门文章

  1. 软件工程(2019)第二次作业
  2. python之旅-day2(较基础阶段)
  3. sklearn—特征工程
  4. CCF201412-2 Z字形扫描(模拟)
  5. 【Win】使用L2TP出现809错误
  6. 使用git初始化本地仓库并提交到远程分支
  7. Oracle远程连接
  8. 0-10不断循环的js
  9. 学习C#面向对象设计模式纵横谈---笔记
  10. 获取周一_周一个股精选:光伏概念、央企改革:太阳能(000591)