Prime算法 C++实现

article/2025/9/14 6:25:59

                                            Prime算法

           算法介绍:

                      课本实现方法:

                       先从最小堆说起(heap):任一结点的关键码均小于或等于它的左右子女的关键码,位于堆顶(即完全二叉树的根结点的位置)的结点的关键码是整个集合中最小的,称其为最小堆。

                       如果有关键码(各个数据记录中存在一个能够标识数据记录的数据项,并将其组织)的集合K={k0,k1,k2,...,kn-1},把它的所有元素按照完全二叉树的顺序存储来存放在一个一维数组中,满足ki≤k2i+1且ki≤k2i+2 ,

     i=0,1,...[(n-2)/2],则称这个集合为最小堆。

                      通过在一个最小堆存储图的边,每次选出一个端点在生成树中,另一个端点不在生成树中的权值最小的边(u,v),另外一个正好在最小堆的堆顶,将其从堆中退出,加入生成树;然后将刚才新出的两个端点放置入最小堆中。

迭代,将权值最小的又上升到最小堆的堆顶。重复N-1次,建立该图的最小生成树。

                   代码见数据结构(清华大学系列教材)课本P375。

                   

      

                    另外自己构造一个图,对其遍历求解最小生成树:
                    见图:

                   

                                由上述图,得出最小生成树,

                   核心算法:

                             将该树分为两个集合A、B,A集合是最小生成树中的结点,B是未处理的结点,选择一个结点,将这个结点加入A中,然后,对集合A中的顶点遍历,找出A中顶点关联的边权值最小的顶点,将其从B中删除,加入集合A中,不断递归直至B中结点为空结                                束。  

                            关键:每在最小生成树集合中加入一个点就需要把这个点与集合外的点比较,不断的寻找两个集合之间最小的边。

                           例如上述图中,假设从0开始找最小生成树,遍历到1结点时,选择3结点,3结点为新加入的结点,将3结点加入到生成树集合中后,需要与集合外5结点相连的结点之间的权值比较,发现1结点与5结点的权值为4,3结点与5结点权值为7,因此,选择从1                          结点到5结点的路径,加入最小生成树,直至所有点加入到生成树中,记录路径,统计长度。

                             因此,需要一个辅助数组visit[]记录是否加入最小生成树,还需要一个lowcost[]数组存放最小生成树,需要根据已经建立map[]数组(即邻接矩阵)来存储图的数据权值。对map的操作在关键处需要重新进行一个if判断(即判断!vist[j]=1&&lowcost[j]>map[index][j])lowcost[j]=map[index][j];   也就是说map[index][j]图中的结点从index->j的权值小于最小生成树中lowcost[j]中已经进入结点的权值,就更新将map[index][j]更新值存到最小生成树的数组中。

                               代码如下:

 1 #include<iostream>
 2 #include<cstring>
 3 #define INF 0x3f3f3f3f
 4 using namespace std;
 5 const int N = 6;
 6 bool visit[N];
 7 int lowcost[N] = { 0 };
 8 int map[N][N] = {   {INF,7,4,INF,INF,INF},
 9                     {7,INF,6,2,INF,4},
10                     {4,6,INF,INF,9,8},
11                     {INF,2,INF,INF,INF,7},
12                     {INF,INF,9,INF,INF,1},
13                     {INF,4,8,7,1,INF}
14                   };
15 int prim(int cur)
16 {
17     int index = cur;
18     int sum = 0;       //最短路径长 
19     int i = 0 , j = 0;
20     cout << index << "->";
21     memset(visit,false, sizeof(visit));  
22     visit[cur] = true;
23     for(i = 0; i < N; i++)
24         lowcost[i] = map[cur][i];//初始化,将cur结点所有相连的边放入 
25  
26     for(i = 1; i < N; i++)//两重for循环 遍历每一个结点
27     {
28         int min= INF;   //定义一个变量min初始化为一个极大值 
29         //第一个for循环  未访问的点与与索引点index的比较
30         for(j = 0; j < N; j++)
31         {
32             if(!visit[j] && lowcost[j] < min)//找到未访问的点中,距离当前最小生成树距离最小的点
33             {
34                 min = lowcost[j];  //不断更新与点cur的相连点的最短距离,将lowcost[j]权值更新数据到min上 更新权值 
35                 index = j;//将j数组下标更新到index中(即cur)更新结点 
36             }
37         }
38         visit[index] = true;//标记距离最短的结点已经被访问过
39         cout << index << "->";//输出新结点 
40         sum += min;//权值累加 
41         //第二个for循环  从index结点开始遍历的图中的新结点map[index][j]与最小生成树中lowcost[j]旧结点之间的权值遍历比较 
42         for(j = 0; j < N; j++) 
43         {
44             if(!visit[j] && lowcost[j]>map[index][j])     
45             {
46                 lowcost[j] = map[index][j];
47             }
48         }
49     }
50     cout << endl;
51     return sum;               //返回最小生成树的总路径值
52 }
53 int main()
54 {
55     cout << prim(0) << endl;//从0开始
56     cout << prim(1) << endl;//从1开始
57     cout << prim(2) << endl;//从2开始
58     cout << prim(3) << endl;//从3开始
59     cout << prim(4) << endl;//从4开始
60     cout << prim(5) << endl;//从5开始
61     return 0;
62 }
63  
64  

 

 测试结果:

              

 

            

                   最终图为:

                                          

 

转载于:https://www.cnblogs.com/javabai/p/10988318.html


http://chatgpt.dhexx.cn/article/mGIhXo3u.shtml

相关文章

【数学】Prime-Factor Prime

Prime-Factor Prime 题目描述 A positive integer is called a "prime-factor prime" when the number of its prime factors is prime. For example, 12 is a prime-factor prime because the number of prime factors of 12223 is 3, which is prime. On the other…

Prime Factory (Training, Math)

Prime Factory (Training, Math) 题目描述 Your task is simple: Find the first two primes above 1 million, whose separate digit sums are also prime. As example take 23, which is a prime whose digit sum, 5, is also prime. The solution is the concatination of t…

Fiori Fundamentals和SAP UI5 Web Components

这周有位同事邀请我给团队讲一讲SAP技术的演进历史&#xff0c;所以我准备了下面几个主题来介绍。 其中SAP的技术回顾和演进&#xff0c;我的思路就是从前后台两方面分别介绍。 我画了一张非常简单的图&#xff1a; 去年5月我写过一篇文章&#xff1a;SAP UI和Salesforce UI开…

C++Prime Plus(3)

目录 51.抽象和类52.类的使用53.对象构造54.对象析构55.const与类56.this指针57.类作用域58.运算符重载59.运算符重载的实例60.友元61.运算符重载-成员或非成员62.类的类型转换63.拷贝构造函数与赋值运算符重载64.静态数据成员65.静态成员函数 51.抽象和类 类型的构成 1.数据占…

C++Prime Plus(6)

目录 92.STL(1)容器93.STL(2)迭代器94.STL(3)函数对象95.STL(4)算法 92.STL(1)容器 标准模板库 STL&#xff08;Standard Template Library&#xff09;&#xff0c;是 C 标准库的一部分&#xff0c;不需要单独安装&#xff0c;只需要#include 头文件。STL提供了容器&#xff…

C++Prime Plus(5)

目录 85.异常(1)异常处理机制86.异常(2)exception类87.RTTI(1)88.RTTI(2)89.类型转换运算符90.string类91.智能指针 85.异常(1)异常处理机制 异常&#xff1a;运行错误&#xff08;比如无法打开文件&#xff0c;动态内存申请失败&#xff09;&#xff0c;导致程序无法继续正常…

SAP Fiori学习笔记

资料链接&#xff1a;有些是需要自带梯子的哦&#xff5e; Fiori Design Guidelines​experience.sap.com戴团长&#xff1a;SAP Fiori Design​zhuanlan.zhihu.com如何评价 SAP Fiori Design Guidelines&#xff1f;​www.zhihu.comhttps://mp.weixin.qq.com/s?__bizMzIyNjY…

C++Prime Plus(2)

目录 21.for循环(1)22.for循环(2)23.while循环24.do while循环25.二维数组与嵌套循环26.if语句27.逻辑表达式28.条件表达式29.switch语句30.文件概念31.文本文件的输入输出32.函数详解(1)回顾33.函数详解(2)参数传递34.函数详解(3)数组传递35.函数详解(4)C风格字符串36.递归概念…

C++Prime Plus(1)

目录 1.C简介2.程序生成&#xff08;创建源码&#xff0c;编译和链接&#xff09;3.进入C4.C语句5.函数入门6.整型7.char&#xff0c;bool&#xff08;小整数&#xff09;8.const与符号常量9.浮点数10.算术表达式11.数组12.C风格字符串13.C风格字符串14.结构15.指针16.动态内存…

C++Prime Plus(7)

目录 96.输入输出概述97.使用cout输出(1)ostream基本功能98.使用cout输出(2)格式化输出99.使用cin输入100.文件(1)简单的文件IO101.文件打开的进一步讨论102.二进制文件访问103.随机读写 96.输入输出概述 C的输入输出是由库iostream中提供的一组类实现的&#xff1b; 流 C把输…

E-Prime软件包及安装

E-Prime软件包及安装 1 版本问题2 安装过程3 注意事项4 唠唠叨叨 Hello&#xff0c; 这里是行上行下&#xff0c;我是喵君姐姐~ 众所周知&#xff0c;E-Prime是实验设计的执行者。 当我们提出一个想法&#xff0c;则需要一个具体的软件来实现它。 而E-Prime相对于Matlab和Py…

Prime Sample

又发现了个框架 但没有代码啊~~ 还是搬来了&#xff0c;重要样本关注机制&#xff0c;一种新颖的目标检测框架 上论文 论文地址&#xff1a; https://arxiv.org/pdf/1904.04821.pdf 在目标检测框架中&#xff0c;平等对待所有样本并以平均性能最大化目标是一种常见的范例。在…

Prime Factors

此题需要使用到质因子分解的算法&#xff0c;可以参考以下链接&#xff1a; https://blog.csdn.net/qq_42410605/article/details/100150140 题目描述&#xff1a; Given any positive integer N,you are supposed to find all of prime factors,and write them in the form…

SpringBoot实现分布式锁

SpringBoot实现分布式锁 先了解一下线程数&#xff1a; 线程锁 线程锁&#xff1a;主要用来给类&#xff0c;方法&#xff0c;代码加锁&#xff0c;当某个方法或者某块代码使用synchronize关键字来修饰&#xff0c;那么在同一时刻最多只能有一个线程执行该代码&#xff0c;如…

深入理解ConcurrentHashMap原理分析以及线程安全性问题

在之前的文章提到ConcurrentHashMap是一个线程安全的&#xff0c;那么我么看一下ConcurrentHashMap如何进行操作的。 ConcurrentHashMap与HashTable区别&#xff1f; HashTable put()源代码 我们来看一下put 操作&#xff1a; 方法体 被 同步锁标记&#xff0c;由于同步锁的…

Redis分布式锁到底安全吗?

若有收获,请记得分享和转发哦 这篇文章我想和你聊一聊&#xff0c;关于 Redis 分布式锁的「安全性」问题。 Redis 分布式锁的话题&#xff0c;很多文章已经写烂了&#xff0c;我为什么还要写这篇文章呢&#xff1f; 因为我发现网上 99% 的文章&#xff0c;并没有把这个问题真正…

Java线程安全

前段时间有测试一个后端对账单和话单采集服务,在测试过程中有涉及到数据库读写逻辑和并发的场景,所以结合经验针对系统技术架构设计了部分并发场景结合数据库读写时可能出现的一些问题的用例,也确实出现了一些测试环境容易忽视,线上环境确确实实可能出现的问题,当然最后还是得到…

线程安全之 - ThreadLocal

ThreadLocal的底层原理 ThreadLocal是Java中所提供的线程本地存储机制&#xff08;线程内共享&#xff09;&#xff0c;可以利⽤该机制将数据缓存在某个线程内部&#xff0c; 该线程可以在任意时刻、任意⽅法中获取缓存的数据&#xff1b;ThreadLocal底层是通过ThreadLocalMap…

线程锁(ReentrantLock、synchronized)为何不能用作分布式锁

为什么使用分布式锁 分布式锁实现目前有三种&#xff1a; 数据库乐观锁&#xff1b;ZooKeeper的分布式锁;Redis的分布式锁&#xff1b; 在以前单体架构Web应用场景下&#xff0c;我们可以使用ReentrantLock或synchronized进行上锁&#xff0c;保证资源安全&#xff0c;现如今大…

Redis分布式锁真的安全吗?

大家好&#xff0c;今天我们来聊一聊Redis分布式锁。 首先大家可以先思考一个简单的问题&#xff0c;为什么要使用分布式锁&#xff1f;普通的jvm锁为什么不可以&#xff1f; 这个时候&#xff0c;大家肯定会吧啦吧啦想到一堆&#xff0c;例如java应用属于进程级&#xff0c;…