已知一个有向图如图,请分别写出从顶点a出发进行深度优先遍历和广度优先遍历所得到的顶点序列及生成树。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已知一个有向图如图,请分别写出从顶点a出发进行深度优先遍历和广度优先遍历所得到的顶点序列及生成树。相关的知识,希望对你有一定的参考价值。

已知一个有向图如右下图所示,请分别写出从顶点a出发进行深度优先遍历(DFS)和广度优先遍历(BFS)所得到的顶点序列及生成树(林)。(要求:有多个顶点可供选择时,序号小的优先。)

一、深度生成树:abdcefigh,如下图所示:

二、广度生成树:abcdefghi,如下图所示:


相关特点:

(1)生成树协议提供一种控制环路的方法。采用这种方法,在连接发生问题的时候,你控制的以太网能够绕过出现故障的连接。

(2)生成树中的根桥是一个逻辑的中心,并且监视整个网络的通信。最好不要依靠设备的自动选择去挑选哪一个网桥会成为根桥。

(3)生成树协议重新计算是繁冗的。恰当地设置主机连接端口(这样就不会引起重新计算),推荐使用快速生成树协议。

(4)生成树协议可以有效的抑制广播风暴。开启生成树协议后抑制广播风暴,网络将会更加稳定,可靠性、安全性会大大增强。

参考技术A

深度:abdcefigh

广度:abcdefghi

本回答被提问者采纳
参考技术B

    DFS(Depth-First-Search)深度优先搜索算法,是为了要达到被搜索结构的叶节点的搜索算法的一种,早期使用较多。

    宽度优先搜索算法(又称广度优先搜索)是最简便的也是很多重要图算法原型搜索算法之一。

参考技术C 你知道一个邮箱图形。分别写出顶点可以发出一个深度的优先遍历条件。 参考技术D 麻烦你把这道题拍照,然后去百度作业帮搜索一下,那里边有比较详细的解答过程,希望我的回答能够帮助的你

图的深度优先搜索

图有两种最基本的搜索算法,一种是深度优先搜索,另一种是广度优先搜索。本节先介绍深度优先搜索。

一、基本思想

深度优先遍历图的方法是,从图中某顶点v出发:
1 访问顶点v;
2 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
3 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

二、例子

有一个图如下,求深度优先搜索顺序。

graph.png

分析:首先看看每个元素和哪些元素相邻

元素 相邻元素
1 2,3
2 1,4,5
3 1,6,7
4 2,8
5 2,8
6 3,7
7 3,6
8 4,5

(1)假设从节点1开始遍历(事实上可以从任何一个节点开始),与1相邻的是2和3
(2)遍历2之后,进入递归。2有三个相邻元素,1,4,5。因为1已经遍历过了,因此遍历4
(3)遍历4之后,进入递归。与4相邻的是2和8,因为2已经遍历过了,所以遍历8
(4)遍历8之后,进入递归。与8相邻的是4和5,因为4已经遍历过了,所以遍历5
(5)遍历5之后,进入递归。与5相邻的是2和8,因为2和8都已经遍历过了,所以递归终止。返回步骤(4)
(6)因为步骤(4)中的4和5都已经遍历过了,返回步骤(3)
(7)因为步骤(3)中的2和8都已经遍历过了,返回步骤(2)
(8)因为步骤(2)中的1,4,5都已经遍历过了,返回步骤(1)
(9)因为步骤(1)中的2已经遍历过了,这次遍历的是3
(10)遍历3之后,进入递归。与3相邻的是6和7,所以遍历6
(11)遍历6之后,进入递归。与6相邻的是3和7,因为3已经遍历过了,所以遍历7
(12)遍历7之后,进入递归。与7相邻的是3和6,因为3和6都已经遍历过了,递归结束。返回步骤(11)
(13)在(11)中,3和7都遍历过了,返回步骤(10)
(14)在(10)中,6和7都遍历过,返回步骤(1)
(15)在步骤(1)中,没有未遍历过的元素。遍历结束。
   由上面的15个步骤可知,深度搜索遍历的顺序为:1,2,4,8,5,3,6,7。

三、Python 3代码实现:

class Graph(object):
   def __init__(self):
       self.node_neighbors = {}
       self.visited = {}
   def add_nodes(self,nodelist):
       for node in nodelist:
           self.add_node(node)
   def add_node(self,node):
       if not node in self.nodes():
           self.node_neighbors[node] = []
   def add_edge(self,edge):
       u,v = edge
       if(v not in self.node_neighbors[u] and u != v):
           self.node_neighbors[u].append(v)
           self.node_neighbors[v].append(u)
   def nodes(self):
       return self.node_neighbors.keys()
   def depth_first_search(self,root=None):
       order = []
       def dfs(node):
           self.visited[node] = True
           order.append(node)
           for n in self.node_neighbors[node]:
               if not n in self.visited:
                   dfs(n)
       if root in self.nodes():
           dfs(root)
       for node in self.nodes():
           if not node in self.visited:
               dfs(node)
       return order
if __name__ == '__main__':
   g = Graph()
g.add_nodes([i+1 for i in range(8)])
g.add_edge((1, 2))
g.add_edge((1, 3))
g.add_edge((2, 4))
g.add_edge((2, 5))
g.add_edge((4, 8))
g.add_edge((5, 8))
g.add_edge((3, 6))
g.add_edge((3, 7))
g.add_edge((6, 7))
print ("Original nodes: ", g.nodes())
order = g.depth_first_search(1)
print ("Depth-First-Search order: ", order)

运行结果:

Original nodes:  dict_keys([1, 2, 3, 4, 5, 6, 7, 8])
Depth-First-Search order: [1, 2, 4, 8, 5, 3, 6, 7]




wechat_344.jpg


以上是关于已知一个有向图如图,请分别写出从顶点a出发进行深度优先遍历和广度优先遍历所得到的顶点序列及生成树。的主要内容,如果未能解决你的问题,请参考以下文章

判断一个有向图是否存在回路

20162312图的深度优先遍历补分博客

最短路径

pintia刷题记录——图

图的深度优先遍历补分

深度优先遍历怎么修改为广度优先遍历