图论——读书笔记(基于BFS广度优先算法的广度优先树)
广度优先树
对于一个图G=(V,E)在跑过BFS算法的过程中会创建一棵广度优先树。
形式化一点的表示该广度 优先树的形成过程是这样的:
对于图G=(V,E)是有向图或是无向图, 和图中的源结点s,
我们定义图G的前驱子图为Gf={Vf, Ef}。
其中Vf = {v ->V : v.f <>NIL} AND {s},
Ef = {(v.f , v) : v->(Vf - {s})}
即,G的前驱子图Gf是这样定义的:
Gf中的点集合Vf 中的点是G中的前驱(父结点)结点不为空的 AND G图的源结点。
前驱子图Gf中的边集合Ef 中的边是不包括s(G图中的源点)的Gf图中的所有点v到 v的前驱结点v.f所构成的边。
如果前驱子图中的相应点集合Vf满足由从源结点s可以到达的结点组成,
并且对于所有的v->Vf,
子图Gf包含一条从源结点s到结点v的唯一简单路径,
且该路径也是图G里面从源结点s到结点v之间的一条最短路径的话,
那么前驱子图Gf就是广度优先树。
广度优先树实质是一棵连通的树,
并且|Ef| = |Vf| -1(即,边数= 图中结点总数-1)
下面所示的伪代码实现的了打印出从源结点s到结点v的一条最短路径上的所有的结点。
这里假定BFS已经计算出一棵广度优先树了。
PRINT-PATH(G, s, v) if v==s
print s else if v.f == NIL
print "no path from " s "to" v "exists" elsePRINT-PATH(G, s, v.f)
print v
因为每次递归调用的时候,路径都比前一次调用中的路径少了一个结点,
所以该过程的运行时间是关于所输出路径上顶点数的一个线性函数。
下面是使用C++语言实现的PRINT-PATH的代码片段,
以及在生成广度优先树之后所实现的打印出s到结点v的一条最短路径上的所有结点。
大致的思想是这样的:
对图G跑一边BFS算法之后,
会根据BFS算法对每个结点的访问的顺序,
对G->Adj[i].father这一个属性进行按照BFS算法的特点进行赋值,
在赋值过后调用print_path这个方法就可以显示出来
源结点s到某一个结点v如果二者是相连通的话,
则会显示出二者之间通过广度优先遍历
所得到的连通路径上所经过的结点
void print_path(Graph *G, int s, int v)
{
if(s == v)
print("%c ", G->Adj[s].name); else if(G->Adj[v].father == NULL) printf("no path from %c to %c\n", G->Adj[s].name, G->Adj[v].name ); else
{
print_path(G, s, G->Adj[v].father);
printf("%c ", G->Adj[v].name);
}
}
对图G跑过一边BFS算法之后,
Vf = {v ->V : v.f <>NIL} AND {s},
Ef = {(v.f , v) : v->(Vf - {s})}
所构成的数据结构是基于图G的广度优先树。
主要内容出自
《算法导论 第三版》
图论——读书笔记(基于BFS广度优先算法的广度优先树)的更多相关文章
- 机器学习实战 - 读书笔记(12) - 使用FP-growth算法来高效发现频繁项集
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第12章 - 使用FP-growth算法来高效发现频繁项集. 基本概念 FP-growt ...
- 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...
- 《深入理解Java虚拟机》读书笔记3--垃圾回收算法
转载:http://blog.csdn.net/tjiyu/article/details/53983064 下面先来了解Java虚拟机垃圾回收的几种常见算法:标记-清除算法.复制算法.标记-整理算法 ...
- opencv2对读书笔记——使用均值漂移算法查找物体
一些小概念 1.反投影直方图的结果是一个概率映射,体现了已知图像内容出如今图像中特定位置的概率. 2.概率映射能够找到最初的位置,从最初的位置開始而且迭代移动,便能够找到精确的位置,这就是均值漂移算法 ...
- 算法线性编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和
这段时间笔者几篇文章介绍了改算法线性的文章. 关联文章的地址 这个算法我在我的博客里应用动态规划做过,详细实现请参阅我的dp板块,下面给出书上最快的算法,时间复杂度为O(n),称之为线性算法. #in ...
- <算法图解>读书笔记:第1章 算法简介
阅读书籍:[美]Aditya Bhargava◎著 袁国忠◎译.人民邮电出版社.<算法图解> 第1章 算法简介 1.2 二分查找 一般而言,对于包含n个元素的列表,用二分查找最多需要\(l ...
- 机器学习实战读书笔记(二)k-近邻算法
knn算法: 1.优点:精度高.对异常值不敏感.无数据输入假定 2.缺点:计算复杂度高.空间复杂度高. 3.适用数据范围:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训 ...
- 《c程序设计语言》读书笔记-递归实现快速排序算法
#include <stdio.h> void swap(int v[],int i,int j) { int temp; temp = v[i]; v[i] = v[j]; v[j] = ...
- 读书笔记《数据结构与算法JavaScript描述》第一章
第一章JavaScript的编程环境和模型 1.2JavaScript编程实践 1.2.1 声明和初始化变量 JavaScript中的变量默认为全局变量,如果初始化未被声明的变量,该变量就成了一个全局 ...
随机推荐
- mac下设置命令别名
项目使用了gerrit,每次push代码都需要执行 git push origin HEAD:refs/for/master 为了简便,使用了alias命令来控制台下使用下面的命令简化了提交. ali ...
- Quartz 有状态的JobDataMap
Quartz,每次执行job,job永远是全新的对象,但是,如果job实现org.quartz.StatefulJob接口,而不是job接口. 此时JobDetail的JobDataMap将会共享一个 ...
- python换行写入文件
今天用python做写入文件时,碰到,写入的东西不能换行,打开写入的文件都是一行.后来发现需要在写入的字符后面加上+'\n'. 另外python需要追加写入文件的时候,是用这个方法f = open(' ...
- poj1150
这道题告诉我们递推一定要慢慢细细的推Pmn=n!/m!,我们可以先考虑n!的最后一位是什么首先最后一位非0位我们首先想到把0都干掉也就是先把2和5提出来,这两个其实是同样的方法对于N!中有多少个因数2 ...
- VM Depot 镜像新增系列II – 学习管理系统,内容管理系统以及平台管理工具
发布于 2014-06-23 作者 刘 天栋 继上周企业管理软件和电子商务镜像的加盟之后,我们看到又有一批内容管理解决方案(CMS),学习管理解决方案(LMS)以及平台管理工具 (如 Open ...
- Linux学习笔记17——输入输出重定向
1 何谓输入输出重定向? 默认情况下输入是由键盘输入的.输出是默认的输出到屏幕上.而输入输出重定向就是改变默认的输入输出方向 2 freopen函数 freopen是被包含与stdio.h头文件中,是 ...
- vimium快捷键列表
最近越来越懒了,不想拿手去碰鼠标,就想这样放在键盘上,在MacOSX下基本的操作也都能实现了,Xcode也没什么问题,现在就是有个地方十分不方便,就是浏览网页的问题,不管怎么样都是需要鼠标来浏览网页, ...
- mac上的键盘生活——quicksliver
昨天晚上一直在找mac上的博客客户端,没发现很好的国内支持客户端,却发现了一个新的东西--quicksliver 简单的说,这个就是个快捷键启动方式,这是我在mac上用的最好的一个快捷键启动程序( ...
- 通过例子学python(2.1)
第二章 列表和元组 2.1 序列概览 #第2章 列表和元组 #2.1 序列概览 #序列sequence , 序列中每一个元素被分配一个序号,即元素的位置,也称为索引. #从前往后,0,1,2,3,:从 ...
- 深入浅出node(4) 异步编程
一)函数式编程基础 二)异步编程的优势和难点 2.1 优势 2.2 难点 2.2.1 异常处理 2.2.2 函数嵌套过深 2.2.3 阻塞 2.2.4 多线程编程 2.2.5 异步转同步 三)异步编程 ...