图论——深度优先搜索,广度优先搜索,拓扑排序

这是两种常用的搜索方式,但是应用不同。

广度优先搜索,在与搜索一个节点到另一个节点的最短距离。
深得优先搜索则侧重图中节点(假设节点代表某些事件)的发生顺序。

广度优先搜索

广度优先搜索,类似与将图组织称一种树的形式(但是可能不是一棵树,应为有环形)。
然后分层进行遍历,一层遍历玩以后遍历下一层。

使用队列作为辅助。遍历一层节点(也就是所有分支)的时候将下一层节点都添加到队列,这样,一层结束以后,下一层的节点都在队列中。然后从该队列中取元素,进行处理,处理的同时,将本层的节点的下一层(也就是相关联节点再次添加到队列)。
在遍历的时候需要一个memo,用来记录该节点的遍历状态
第一种memo:已遍历,正在遍历,未遍历。
原因在于,当节点处于正在遍历的状态时,如果节点的兄弟节点相互连通,那么第二个兄弟节点将会遍历两次,所以在第一次遇到一个节点的时候,标记为正在遍历。当再次遇到带节点(兄弟节点要添加该节点进队列),节点为正在遍历,因此跳过添加。
只添加未遍历的节点进队列。

第二种memo:已遍历,为遍历
这种memo方法,在添加如队列之前就将其标记为已遍历。这样就避免了循环添加。

最短路径

广度有限搜索是可以的到最短路径的,其的到最短路径的方式在于:
每个节点存储一个值d表示该节点到起点的距离。同时存放一个本节点的父节点p
在遍历的过程中,如果本节点为未遍历,那么:本节点的d等于上一个节点的d+1,本节点的p等于上一个节点。
该赋值过程发生在添加到队列之前,某点已经被添加到队列,那么不应该在赋值。

当遍历存在分支,在某个点的时候两个分支回合,第一次遍历的时候将回合点添加到队列,而本条分支就是会合点距离起始点的最短路径。而下一次遍历到回合点的分支,一定大于等于本次的。
因为广度优先遍历按层遍历。

最短路径就保存在这些p中,从结束点,依次递归或者迭代的去访问节点的p就可以到达起始点。

所以,可以看出,广度优先搜索其按层搜索的特征决定了可以用于最短路径的搜索

深度优先搜索

深度优先搜索其搜索过程,是,优先搜索分支的每一条分支。到达最深处返回,再去搜索另一条分支。
这类似与一个栈。

同样也需要上面两种形式的memo,来防止节点的循环添加。

在遍历一个节点的时候,处理完该节点以后,将其分支全部压入栈中。再从栈中取出一个元素,处理该元素结束以后再将该元素的分支压入此栈。。。。。。如此循环,可以发现,栈基本上是在增长的(当分支只有一个时,不变化),直到到达了分支的末端,栈开始减少。

深度优先搜索中的d(距离)并没有什么用,因为其已经不再代表最短距离,而是取决于同一个节点不同分支的遍历顺序。

拓扑排序

因为深度优先搜索的搜索特性,其可以用来表示节点(将节点想象成事件)的发生先后顺序,而遍历的结果是其中一种可能的顺序(存在环形)。

比如,我们从起始点开始遍历图,可以想为,穿衣的顺序。
起始点有两条分支:穿上衣,穿下衣,穿鞋袜。
那么深度优先搜索会尽可能深的遍历其中一条分支,比如穿上衣:内衣->衬衣->外套。
在衬衣和外套之间可能存在戴领带,带臂章最终又在穿外套点回合,因此是一个环形。
内衣->衬衣->领带->臂章->外套。
因为环形的存在因此给出一种顺序。

因此如果每个点保存一个:该点开始处理时间,该点处理结束的时间。
那么在这两个时间之间,是该节点的分支的处理时间。
{a{b...b}{c...c}a}
bb,cc 中间是其节点分支。

最短路径

http://blog.csdn.net/qq_32353771/article/details/52820176

使用最深优先搜索求最短路径,需要在遍历完一个点的时候,再将这个点该为未遍历。
但是低效,如果一个节点的子节点相互连通,那么一定会被重复遍历!

强连通分量

一个有向图中,如果任意两点之间可到达,那么该图是一个强连通图
在一个非强连通图中,某个子图可以是强连通图,那么最大的强连通子图就是强连通分量

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容