实验一 油管铺设

2018.11.06于CSDN释放
详见GitHub: https://github.com/DolorHunter/PrimAlgorithm
实验准备
最小生成树问题,求最小生成树的Prim算法
实验目的
运用最小生成树思想和求最小生成树程序解决实际问题
实验过程
八口海上油井相互间距离如下表,其中1号井离海岸最近,为5km。问从海岸经1号井铺设油管把各井连接起来,怎样连油管长度最短(为便于检修,油管只准在油井处分叉)?

先介绍一下Prim算法, Prim算法是通过局部最优从而逐步达到总体最优的算法.

Prim算法描述

1).输入:一个加权连通图,其中顶点集合为V,边集合为E;
2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
3).重复下列操作,直到Vnew = V:
a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;
4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。

Prim算法运用

Prim图表描述: https://baike.baidu.com/item/Prim/10242166?fr=aladdin

人工模拟本题计算过程

点 过程 距离
1 1->5 0.7
5 5->4 0.7
4 4->8 0.9
8 8->7 0.5
7 7->6 0.6
6 8->3 1.0
3 3->2 0.9
2
总距离为10.2
``
实验代码如下

#include<iostream>
#define MAX 1024.0
using namespace std;int main()
{cout << "Prim最小生成树算法\n" << endl;float fSum = 5; // #1井离岸距离为5, 故初始值为5//fLen 表示每个井之间的距离, 到自己的距离设为MAX (一个远大于距离的值), 防止出错float fLen[8][8]={{MAX, 1.3, 2.1, 0.9, 0.7, 1.8, 2.0, 1.8},{1.3, MAX, 0.9, 1.8, 1.2, 2.8, 2.3, 1.1},{2.1, 0.9, MAX, 2.6, 1.7, 2.5, 1.9, 1.0},{0.9, 1.8, 2.6, MAX, 0.7, 1.6, 1.5, 0.9},{0.7, 1.2, 1.7, 0.7, MAX, 0.9, 1.1, 0.8},{1.8, 2.8, 2.5, 1.6, 0.9, MAX, 0.6, 1.0},{2.0, 2.3, 1.9, 1.5, 1.1, 0.6, MAX, 0.5},{1.8, 1.1, 1.0, 0.9, 0.8, 1.0, 0.5, MAX}};//fMinLen 表示出发点到未到达点的最小距离float fMinLen[7]={MAX, MAX, MAX, MAX, MAX, MAX, MAX};//iDeparture[] 表示出发点int iDeparture[8]={0};iDeparture[0] = 1;  //存入标准点(1-8)cout << "初始油井:" << iDeparture[0] << "\t" << "最短距离:" << fSum << "\n" <<endl;for(int i=0; i<8-1; i++)  //遍历每一个剩余出发点{//j表示本次到达点(列表点)for(int j=0; j<8; j++)  //遍历每一个潜在到达点{//newspot为是否为新井的判断 (true表示是新井, false表示是旧井)bool newspot = true;for(int t=0; t<i+1; t++){if(iDeparture[t]-1 == j){newspot = false;break;}//end of if}//end of for(t)if(newspot){for(int k=0; k<i+1; k++)  ///遍历出发点集{//l表示本次出发点int l=iDeparture[k]-1;  //读入出发点列表点(0-7)if((fMinLen[i] > fLen[l][j])) //最小距离大于fLen改写fMinLen和iDeparture[]{fMinLen[i] = fLen[l][j];iDeparture[i+1] = j+1;}//end of if}//end of for(k)}//end of if}//end of for(j)cout << "新的油井:" << iDeparture[i+1] << "\t" << "最短距离:" << fMinLen[i] << "\n" << endl;fSum = fSum + fMinLen[i];}//end of for(i)cout << "总距离为:" << fSum << "\n" << endl;return 0;
}

运行结果

Prim最小生成树算法初始油井:1    最短距离:5新的油井:5    最短距离:0.7新的油井:4  最短距离:0.7新的油井:8  最短距离:0.8新的油井:7  最短距离:0.5新的油井:6  最短距离:0.6新的油井:2  最短距离:0.9总距离为:10.2

                                         Copyright: dolor_059

离散实验一 油管铺设 (求最小生成树的Prim算法的实际应用)相关推荐

  1. C语言Prims求最小生成树MST的算法(附完整源码)

    C语言Prims求最小生成树MST的算法 C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测试) C语言Prims求最小生成树MST的算法完整源码(定义,实现,main函数测 ...

  2. 数据结构笔记(二十九)--最小生成树(prim算法思想)

    最小生成树(prim算法思想) 一.预知概念 直达:两顶点直接相连接 路径:两顶点之间可以有其他顶点,但最终两顶点是能够连接的 假如我们有四台电脑,怎样连接才能保证这四台电脑两两相互通信组成局域网呢? ...

  3. 最小生成树(Prim算法,Kruskal算法)

    最小生成树 假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路.这时,自然各 考虑这样一个问题,如何在最节省经费的前提下建立这个通信网. 在每两个城市之间都可设置一条线路,相应地都要 ...

  4. 最小生成树之 Prim算法 Kruskal算法

    1 描述 问题:修建一个连接各个小区与煤气供应站点之间的管道,使得造价成本最低,即构造一颗最小生成树.但是如何求解? 对应模型:树结构,生成树,最小生成树 2 prim算法实例 基本思想:在满足如下条 ...

  5. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

  6. #1097 : 最小生成树一·Prim算法

    #1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可 ...

  7. 最小生成树的prim算法(java)

    /** * 最小生成树的prim算法 * @author liuy */ public class Prim { public static void prim(int num, float[][] ...

  8. hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)

    还是畅通工程                                                                            Time Limit: 4000/2 ...

  9. 【codevs1078】最小生成树,prim算法

    最小生成树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起 ...

最新文章

  1. 【c语言】蓝桥杯算法提高 P0401
  2. PHP和ajax详解
  3. sklearn-GridSearchCV调节超参数
  4. declaration of 'int ret' shadows a parameter
  5. Java技术:收集16 条 yyds 的代码规范,值得一读!
  6. Linux运维系统工程师系列---04
  7. 【linux】Ubuntu 18.04 设置桌面快捷启动方式
  8. javascript之嵌套函数
  9. Executors源码解读——创建ExecutorService线程池
  10. dj鲜生-31-用户中心-功能需求分析
  11. 计算机视觉论文-2021-06-15
  12. DistributionDB过大的原因
  13. Border属性的各种变化
  14. html页面 request,HTML DOM requestFullscreen() 方法
  15. ant design vue table 高度自适应_Table行内的开关组件的使用
  16. Xamarin 初学,设计一个简单的美景展示App(只实现了部分功能)
  17. Android 的Excel表的数据导出
  18. keep sb updated_keep me updated是什么意思
  19. 深度学习与TensorFlow实战(十)卷积神经网络—VGG(16)神经网络
  20. 迅捷音频转换器怎么使用? 1

热门文章

  1. Redis的持久化操作---RDBAOF
  2. c++14:std::quoted
  3. 二战计算机技术,重庆大学超强二战跨考计算机技术专业经验,学习方法
  4. 手机QQ后台清理不掉的秘密——anddroid悬浮窗
  5. plex插件显示无服务器,deepin 15.11 安装plex和插件
  6. Soul一声响,你的意中人就来了
  7. dedecms中[field:imglink/]图片大小问题解决办法
  8. 汇报工作的六大原则,不然怎么努力也白费
  9. 《posix多线程编程》笔记(四)
  10. 重读《从菜鸟到测试架构师》-- 构建的过程