广度优先树

对于一个图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. h.264并行解码算法分析

    并行算法类型可以分为两类 Function-level Decomposition,按照功能模块进行并行 Data-level Decomposition,按照数据划分进行并行 Function-le ...

  2. MFC窗口风格 WS_style/WS_EX_style(超详细)

    窗口风格(Window style) WS_BORDER   有边框窗口 WS_CAPTION   必须和WS_BORDER风格配合,但不能与WS_DLGFRAME风格一起使用.指示窗口包含标题要部分 ...

  3. Git命令详解

    一个中文git手册:http://progit.org/book/zh/ 原文:http://blog.csdn.net/sunboy_2050/article/details/7529841 前面两 ...

  4. 【CF】220B Little Elephant and Array

    区间动态统计的好题. /* */ #include <iostream> #include <string> #include <map> #include < ...

  5. 基于Qt的信号分析简单应用软件的设计

    一.需求描述: 1.读取data.asc文件,分析其连续性: 2.绘制信号图像,并保存. 二.UI界面组成: 该应用的UI由以下几个控件组成: 3个PushButton:打开文件.图像保存.退出: 1 ...

  6. Azure SQL 数据库的灵活缩放预览版简介

    Eron Kelly SQL Server 产品管理部门产品市场营销总经理 几天前,我们宣布了发布 Azure SQL 数据库的灵活缩放公共预览版.新增的灵活缩放功能通过简化开发和管理,简化了扩展和缩 ...

  7. (转载)Mysql查找如何判断字段是否包含某个字符串

    (转载)http://www.th7.cn/db/mysql/201306/31159.shtml 有这样一个需求,在Mysql数据库字符串字段(权限)中,用户有多个不同的邮箱,分别被‘,’分开,现在 ...

  8. WebClient的超时问题及解决

    WebClient的超时问题及解决 转自:http://blog.163.com/xiaozhi797@126/blog/static/62440288201112245345838/   Webcl ...

  9. poj 1696 Space Ant 极角排序

    #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #inclu ...

  10. Django中的Form(二)

    一.保存用户输入内容 如果用户输入一张表单提交后出现错误时,会出现重现填写的情况.我们可以把用户输入的信息保存下来,并返回到前台页面,这样用户就无需再次输入. views.py # coding:ut ...