图 续2

-----------------siwuxie095

图的遍历

图的遍历 分为:深度优先搜索 和 广度优先搜索

不同的方式在遍历时,遍历路径是不一样的

深度优先搜索

对如下图进行深度优先搜索:

需要先选定一个点,假设选定的点为 A

先从 A 的一支开始搜索,搜索到 B,接着:

从 B 搜索到 C,从 C 搜索到 E,从 E 搜索到 F,直到

从 F 再搜索时已经形成了一个环为止

再从 A 的另一支开始搜索,搜索到 D,接着:

从 D 搜索到 G,从 G 搜索到 H,直到从 H 再搜索时

已经形成了一个环为止

通过上面的搜索过程,不难发现,这与二叉树的前序遍历的

根 - 左 - 右 模式 非常相似

其实,对于图的深度优先搜索来说, 就是前序遍历:

先搜索根,然后再搜索与根连接的每一个节点,而且需要深入

到这个节点的最终端

最后:

深度优先搜索的顺序:A B C E F D G H

其中:B 到 F 的边,和 D 到 H 的边,需要舍弃掉,

因为它们已经使得当前的这棵树形成了一个环

广度优先搜索

广度优先搜索 其实比 深度优先搜索 更容易理解

对如下图进行广度优先搜索:

如果把这张图分成层,广度优先搜索其实就是一层一层的去搜索,

它的搜索顺序就是先搜索 A,再搜索 B、D,然后搜索 C、F、G、

H,最后搜索 E

最后:

广度优先搜索的顺序:A B D C F G H E

其中:E 到 F 的边,和 G 到 H 的边,需要舍弃掉,

因为它们已经使得当前的这棵树形成了一个环

最小生成树

通过对 深度优先搜索 和 广度优先搜索 的了解,不难发现,

采用不同的搜索方式,形成的生成树是不一样的

但是这样的遍历,其实还是相对比较简单的,它并没有涉及

到权值的问题。在一张图中,顶点和顶点之间的边如果是有

权值的,它的问题将会更加复杂

这样,就涉及到 最小生成树 的问题

看如下实例:

有这样六个城市,分别叫 A、B、C、D、E、F,需要在六个城市

之间修路(可以看成是六个顶点)

其实每两个城市之间都可以修路,但是修路的成本可能不一样,中间也许隔着山

如:从 A 市修向 B 市,如果中间隔着山,成本就会很高,假设权值为 6

那就不如先从 A 市修到 F 市,再从 F 市修到 B 市,这样,总权值才为 3

可见:如果有了权值之后,想把所有顶点全部连接起来,且使得最后连接

起来的结果最为经济,这样,就是一颗最小生成树

希望达到的结果是这样:

从 A 开始:A 修到 F,F 修到 B,B 修到 C,F 修到 D,D 修到 E

不难发现,选择的全是值比较小的边,而加起来的总成本也最小

但是,有了左图,通过它去求一棵最小生成树,从而达到右图的

效果,却是需要一套算法的

这样的算法,共有两种:

一种叫做 普里姆(Prim)算法,一种叫做 克鲁斯卡尔(Kruskal)算法

普里姆(Prim)算法

普里姆(Prim)算法的基本思想:

1)首先要有一个点集合,是指纳入到最小生成树中的点集合

2)其次要有一个边集合,是指纳入到最小生成树中的边集合

3)最后要有一个待选边集合,是指被选定点可以到达的所有边的集合

第一步:

假设从 A 点开始,则 A 就是选定的第一个点,把 A 纳入到点集合中

从 A 向外延伸出去一共有三条边,分别是 A-B、A-F、A-E,把这三

条边纳入到待选边集合中

从待选边集合中找出权值最小的边,即 A-F,把 A-F 纳入到边集合中

这样,第一个点 和 第一条边 就确定下来了

第二步:

边 A-F 连接了下一个点 F,把 F 纳入到点集合中

把从 A、F 向外延伸出的所有边都纳入到待选边集合中

待选边集合进一步扩充,变成 A-B、A-F、A-E、F-B、F-E、

F-C、F-D

「注意:同一条边,不需要重复写,如:A-F 和 F-A」

其中 A-F 已被选走,不能再被选

从剩下待选边集合中找出权值最小的边,即 F-B,把 F-B 纳入到边集合中

第三步:

边 F-B 连接了下一个点 B,把 B 纳入到点集合中

把从 A、F、B 向外延伸出的所有边都纳入到待选边集合中

待选边集合进一步扩充,变成 A-B、A-F、A-E、F-B、F-E、

F-C、F-D、B-C

其中 A-F、F-B 已被选走,不能再被选

从剩下待选边集合中找出权值最小的边,即 B-C,把 B-C 纳入到边集合中

第四步:

边 B-C 连接了下一个点 C,把 C 纳入到点集合中

把从 A、F、B、C 向外延伸出的所有边都纳入到待选边集合中

待选边集合进一步扩充,变成 A-B、A-F、A-E、F-B、F-E、

F-C、F-D、B-C、C-D

其中 A-F、F-B、B-C 已被选走,不能再被选

从剩下待选边集合中找出权值最小的边,即 F-D,把 F-D 纳入到边集合中

第五步:

边 F-D 连接了下一个点 D,把 D 纳入到点集合中

把从 A、F、B、C、D 向外延伸出的所有边都纳入到待选边集合中

待选边集合进一步扩充,变成 A-B、A-F、A-E、F-B、F-E、

F-C、F-D、B-C、C-D、D-E

其中 A-F、F-B、B-C、F-D 已被选走,不能再被选

从剩下待选边集合中找出权值最小的边,即 D-E,把 D-E 纳入到边集合中

第六步:

边 D-E 连接了下一个点 E,把 E 纳入到点集合中

此时,点集合中有 A、F、B、C、D、E,即 全部六个点都被连接

了起来,形成了一棵最小生成树

克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔(Kruskal)算法的基本思想:

1)首先要有一个待选边集合,是指一张图中所涉及的所有边的集合

1)其次要有一个已选边集合,是指纳入到最小生成树中的边集合

2)最后要有一个已涉及点集合,是指纳入到最小生成树中的点集合

第一步:

首先把这张图中所涉及的所有边都纳入到待选边集合中

从待选边集合中找出权值最小的边,即 A-F,把 A-F 纳入到已选边集合中

选定边的同时,也选定了点,把 A、F 纳入到第一个已涉及点集合中

第二步:

待选边集合中 A-F 已被选走,不能再被选

从剩下待选边集合中找出权值最小的边,即 F-B,把 F-B 纳入到已选边集合中

选定边的同时,也选定了点,把 B 纳入到第一个已涉及点集合中

其实 D-E 的权值也为 2,F-B 和 D-E 二者任选其一即可,这里先选 F-B,

F-B 选出来之后、纳入到已选边集合之前,要判断一下:

当前的 F-B 有没有与以前的 A-F 形成闭环,如果形成了闭环,就需要将

这条边抛弃掉

显然,这里没有形成闭环,于是 F-B 这条边就被纳入到已选边集合中

即 每次从待选边集合中选边时,都要做如下操作:

1)当最小权值的边有多条时,任选其一

2)如果当前选定的边与已选边集合中的边形成了闭环,

就将这条边抛弃掉,重新选择

第三步:

待选边集合中 A-F、F-B 已被选走,不能再被选

从剩下待选边集合中找出权值最小的边,即 D-E,把 D-E 纳入到已选边集合中

注意:默认在 D-E 纳入到已选边集合之前,就已经判断没有形成闭环

选定边的同时,也选定了点,把 D、E 纳入到第二个已涉及点集合中

因为通过已选定边集合无法让 A、F、B 和 D、E 相连,所以要纳入到

两个不同的已涉及点集合中

第四步:

待选边集合中 A-F、F-B、D-E 已被选走,不能再被选

从剩下待选边集合中找出权值最小的边,即 B-C,把 B-C 纳入到已选边集合中

注意:默认在 B-C 纳入到已选边集合之前,就已经判断没有形成闭环

选定边的同时,也选定了点,把 C 纳入到第一个已涉及点集合中

因为通过已选定边集合无法让 A、F、B、C 和 D、E 相连,所以要纳入到

两个不同的已涉及点集合中

第五步:

待选边集合中 A-F、F-B、D-E、B-C 已被选走,不能再被选

从剩下待选边集合中找出权值最小的边,即 F-D,把 F-D 纳入到已选边集合中

注意:默认在 F-D 纳入到已选边集合之前,就已经判断没有形成闭环

已选定边集合中的 F-D 使得两个不同的已涉及点集合中的 F 和 D 关联了起来,

即 两个不同的已涉及点集合有了联系,融合成为一个已涉及点集合

此时,已涉及点集合中有 A、F、B、D、E、C,即 全部六个点都被连接

了起来,形成了一棵最小生成树

【made by siwuxie095】

时间: 2024-12-23 13:18:47

图 续2的相关文章

图 续1

------------------siwuxie095 图的存储结构 这里介绍 图的存储结构,也称为 图的表示法 毕竟,图画出来并不是为了好玩,而是要用这些图去一些实际问题, 那么要让这些图去解决实际问题,该怎么利用它呢? 第一步,就必须要把 图 变成 数据,而这些数据又能真实的反映出图 中的 顶点与边 或 顶点与弧 之间的关系(这里介绍的也正是第一步) · 对于有向图来说,它是由 顶点和弧 组成的 · 对于无向图来说,它是由 顶点和边 组成的 所以,去存储有向图和无向图时,在存储算法上,会有

利用filter实时切换big5和gb2312,以及gb2312的简繁体

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

俑烟汲的诿樟透磺勒秤窗mvus

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

特朗普的中国命题作文,很可能以贸易战开头文图/陆飞

文图/陆飞 大选的结果让很多人意外,嘴硬的特朗普笑到了最后:希拉里也挺有风度,主动给特朗普打电话,这算是认输了. 对于选举结果的分析:为什么希拉里得势不得分,为什么特朗普成功上位,本文不再赘述.一直看热闹的我们,现在可以关心下一个话题,特朗普将怎么书写摆在他面前的其中一篇命题作文:中国. 1.复盘,反全球化和孤立主义帮了特朗普 有必要简单复盘特朗普获胜的关键,看一张图(蓝色-民主党·希拉里,红色-共和党·特朗普):   发文时,根据微软必应大数据,大选前全美共有18个"摇摆州"--其中

iOS最新上线流程+续费 2015-7-20更新

一.程序上线前准备 确认图标是否?全,应?的icon图标 在以前图?片直接命名 为icon就可以了,在xcode5以后,苹果加 ?入了images.xcasset这个?文件夹,所有的 图标全都在这?里配置,有2个需要配置, 1.appicon(应?用的图标),2. LaunchImage(启动默认图) 应?用名称的修改 打开?工程,在info?里?面的Bundle displayName中修改应?用的名称 你的应?用在上线前需要进?行测试,保证基本功能不会崩溃,并且能够看到的按钮, 点击都是要求

hdu1874 畅通工程续(Dijkstra算法,单源最短路)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 36359    Accepted Submission(s): 13355 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.

DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像(续)

背景: 上周通过单步调试,找出了开源库mDCM与DCMTK在对DICOM图像进行JPEG无损压缩时的细小区别,并顺利实现了在C++和C#环境下对DICOM图像的压缩.但是问题接踵而至啊,随着项目的深入,发现在单独的测试工程中可以实现的mDCM版本,在嵌入到项目整体中后,却意外地出现了错误,并未顺利实现DICOM图像的JPEG无损压缩.因此需要继续详细对比分析mDCM与DCMTK两者,期望寻找原因. 问题分析: 开启项目的日志功能后,得到的信息反馈为: No registered codec fo

or1200中IMMU分析(续)

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 2 IMMU中的特殊寄存器 OR1200处理器中的IMMU包含第2组特殊寄存器,如表10.1所示. ITLBW0MRx是指令TLB匹配寄存器,其格式如表10.2所示. 表10.2是OpenRISC 1000规范中的定义,实际在OR1200处理器中只实现了其中一部分字段,包括VPN(Virtual Page Number)的一部分.V(Valid标志位).ITLBW0MRx对应图10.7中MR_RAM的表项,每一个表项对应一个ITLBW0M

CI-持续集成(1)-软件工业“流水线”概述

CI-持续集成(1)-软件工业“流水线”概述 1   概述 持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误 [1]. 持续集成 相当于将传统工业的 流水线 作业的思想应用到现代的 软件工业 中来.不同之处在于,工业流水线 最终出来的是一个一个的产品复制体,但是 软件流水线 最终出来的是