Prim算法——自我理解笔记

       博主初学数据结构与算法,在学习图结构的时候,遇到prim算法时,一头雾水,后来在看到一大牛的博文顿时豁然开朗,有兴趣的朋友可以参看:http://blog.csdn.net/luoshixian099/article/details/51908175,为了以后能够更好的学习,博主准备记录下自己的对prim算法的理解。

prim算法的目的:在加权连通图中找到最小路径实现全节点连通。比如下图,寻找最短路径。很显然是(B,C),(A,C)


而如果对于一颗非常复杂的图呢?

看了一下百度百科的,反正我是没有看进去,我们可以直接看图来了解:

Prim算法——自我理解笔记_第1张图片

一般的想法是,首先,我们随便选取一个节点,比如A,则我们要从其他节点中选择一个最小的权值路径,与A相连的ABCDEF权值分别为(0 5 2 ∞ 6 4),其中与自己和不通的路径权值均表示为0.后面比较的时候排除0。即可用for循环寻找最小权值C点

接下来如何寻找下面一个最小权值节点呢?这一步应该是该算法的核心。

我们在与A,C节点相连的其他节点选出最小的权值路径,难道要用两个for循环,知道了C节点后,下面要用三个for循环继续进行求解吗?显然不行。

于是我们想到了迭代,思想是这样的:先选一个节点,构建一个结构体数组,结构体内有两个元素,一个是预制相连节点的记号,另一个是权值,对于开始选A来说,则该结构体数组为A与A/B/C/D/E/F之间的关系{(0,0)(0,5)(0,2)(0,∞)(0,6)(0,4)}我们先找到与A相连的最小路径节点C。然后for循环找到C节点的中所有路径权值与A的路径权值相应比较,对于C来说,结构体数组为{(2,2)(2,2)(2,0)(2,5)(2,∞)(2,5)},迭代之后变为{(0,0)(2,2)(0,2)(2,5)(0,6)(0,4)}由于节点C已经遍历,则AC权值变为0,以后便不走C点。第一次循环为{(0,0)(2,2)(0,0)(2,5)(0,6)(0,4)}.直到更新到结构体数组中的权值全为0,即5条边。


你可能感兴趣的:(Prim算法——自我理解笔记)