广度优先树

对于一个图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广度优先算法的广度优先树)的更多相关文章

  1. 机器学习实战 - 读书笔记(12) - 使用FP-growth算法来高效发现频繁项集

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第12章 - 使用FP-growth算法来高效发现频繁项集. 基本概念 FP-growt ...

  2. 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...

  3. 《深入理解Java虚拟机》读书笔记3--垃圾回收算法

    转载:http://blog.csdn.net/tjiyu/article/details/53983064 下面先来了解Java虚拟机垃圾回收的几种常见算法:标记-清除算法.复制算法.标记-整理算法 ...

  4. opencv2对读书笔记——使用均值漂移算法查找物体

    一些小概念 1.反投影直方图的结果是一个概率映射,体现了已知图像内容出如今图像中特定位置的概率. 2.概率映射能够找到最初的位置,从最初的位置開始而且迭代移动,便能够找到精确的位置,这就是均值漂移算法 ...

  5. 算法线性编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和

    这段时间笔者几篇文章介绍了改算法线性的文章. 关联文章的地址 这个算法我在我的博客里应用动态规划做过,详细实现请参阅我的dp板块,下面给出书上最快的算法,时间复杂度为O(n),称之为线性算法. #in ...

  6. <算法图解>读书笔记:第1章 算法简介

    阅读书籍:[美]Aditya Bhargava◎著 袁国忠◎译.人民邮电出版社.<算法图解> 第1章 算法简介 1.2 二分查找 一般而言,对于包含n个元素的列表,用二分查找最多需要\(l ...

  7. 机器学习实战读书笔记(二)k-近邻算法

    knn算法: 1.优点:精度高.对异常值不敏感.无数据输入假定 2.缺点:计算复杂度高.空间复杂度高. 3.适用数据范围:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训 ...

  8. 《c程序设计语言》读书笔记-递归实现快速排序算法

    #include <stdio.h> void swap(int v[],int i,int j) { int temp; temp = v[i]; v[i] = v[j]; v[j] = ...

  9. 读书笔记《数据结构与算法JavaScript描述》第一章

    第一章JavaScript的编程环境和模型 1.2JavaScript编程实践 1.2.1 声明和初始化变量 JavaScript中的变量默认为全局变量,如果初始化未被声明的变量,该变量就成了一个全局 ...

随机推荐

  1. 14.6.7 Configuring the Number of Background InnoDB IO Threads 配置InnoDB IO Threads的数量

    14.6.7 Configuring the Number of Background InnoDB IO Threads 配置InnoDB IO Threads的数量 InnoDB 使用后台线程来服 ...

  2. Bluetooth LE(低功耗蓝牙) - 第三部分

    回顾 在本系列的前两篇文章中,我们已经了解了一些关于Bluetooth LE的背景并建立一个简单的Activity / Service框架.   在这篇文章中,我们将探讨Bluetooth LE的细节 ...

  3. 【游戏框架】Phaser

    PhaserDesktop and Mobile HTML5 game framework Phaser Examples

  4. Unity3d shader之卡通着色Toon Shading

    卡通着色的目的是为了让被着色物体显得过渡的不那么好,明暗交界线很明显,等等卡通风格的一系列特征, 也叫Non-photorealisticrendering非真实渲染 重点要做到两点: 1.    描 ...

  5. lightoj 1037 状态压缩

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1037 #include<cstdio> #include<cstri ...

  6. 以O2O为核心的ERP思考

    O2O已经火了一阵子了,很多人都在说O2O,各行各业都想和O2O有所结合,都认为这里面将会有巨大的商机. 在互联网发展到移动互联网的时代,我们的生活的很多方面已经被改变了,很多事情都已经可以在移动端完 ...

  7. Snake - SGU 128(构造多边形)

    题目大意:有N个点,如果可以使用这N个点连接,连接的时候任意两条边要成直角,任意边都要平行于x轴或者y轴,并且不能出现跨立相交,最终组成一个闭合的多边形,求出来这个多边形的最小长度. 分析:容易证明这 ...

  8. Nearly prime numbers - SGU 113(素数)

    题目大意:判断一个数是否是两个素数的乘积,如果是,输出Yes,否则No. 分析:先打表求出来一部分素因子,用素数对素数判定还是比较快的. 代码如下: ========================= ...

  9. 【Android - MD】之NavigationView的使用

    NavigationView是Android 5.0新特性--Material Design中的一个布局控件,可以结合DrawerLayout使用,让侧滑菜单变得更加美观(可以添加头部布局). Nav ...

  10. form与action之setter与getter(转)

    对于表单提交数据给action时候,可以简单的用setter与getter函数实现值的传递. 例如在jsp里有这么个form: <s:form action="login"& ...