文档

dfsearch

深度优先图搜索

语法

v = dfsearch(G,s)
T = dfsearch(G,s,events)
[T,E] = dfsearch(G,s,events)
___] = dfsearch(___“重启”,真的)

描述

例子

v= dfsearch (G,年代适用于深度优先搜索到图G从节点开始年代。结果是一个节点id向量,按照发现的顺序排列。

例子

T= dfsearch (G,年代,事件通过标记一个或多个搜索事件自定义深度优先搜索的输出。例如,T = dfsearch(G,s,'allevents')返回一个包含所有标记事件的表X = dfsearch(G,s,' edgetonnew ')返回由边组成的矩阵或单元格数组。

T,E] = dfsearch(G,年代,事件另外返回一个边缘索引向量E事件设置为“edgetonew”,“edgetodiscovered”,或“edgetofinished”。边缘索引用于唯一地识别多重图中的边缘。

例子

___] = dfsearch(___,'重新启动”,真的)如果从发现的节点无法到达新节点,则重新启动搜索。您可以使用以前语法中的任何输入或输出参数组合。这个选项确保深度优先搜索到达图中的所有节点和边,即使它们从开始节点无法到达,年代

例子

全部折叠

创建并绘制图表。

S = [1 1 1 1 2 2 2 2 2];T = [3 5 4 2 6 10 7 9 8];G =图(s,t);情节(G)

从节点7开始对图执行深度优先搜索。结果表示节点发现的顺序。

v = dfsearch(G,7)
v =10×17 2 1 3 4 5 6 8 9 10

创建并绘制有向图。

A = [0 1 0 1 1 0 0;0 0 0 0 0 0 0;0 0 0 1 0 1 1;0 0 0 0 0 1 0;0 0 0 0 0 0 0;0 0 0 0 0 0 0;0 0 0 0 0 0];G =有向图(A);情节(G)

在从节点3开始的图上执行深度优先搜索。指定“allevents”返回一个包含算法中所有事件的表。

T = dfsearch(G,3,“allevents”
T =13×4表Event Node Edge EdgeIndex ______________ ______________ _________ startnode 3 NaN NaN NaN发现Node 3 NaN NaN NaN edgetonnew NaN 3 4 4 discovernode 4 NaN NaN NaN NaN edgetonnew NaN 4 6 7 discovernode 6 NaN NaN NaN finishnode 6 NaN NaN NaN finishnode 4 NaN NaN NaN edgetofinished NaN 3 6 5 edgetonnew NaN 3 7 6 discovernode 7 NaN NaN NaN finishnode 7 NaN NaN NaN finishnode 3 NaN NaN NaN

要遵循算法中的步骤,请从上到下读取表中的事件。例如:

  1. 算法从节点3开始

  2. 在节点3和节点4之间发现一条边

  3. 发现节点4

  4. 等等……

对具有多个组件的图执行深度优先搜索,然后根据搜索结果突出显示图节点和边。

创建并绘制有向图。这个图有两个弱连接的分量。

S = [1 1 2 2 2 3 4 7 8 8 8 8 8];T = [3 4 7 5 6 2 6 2 9 10 11 12];G =有向图(s,t);p = plot(G,“布局”,“分层”);

c = concomp (G,“类型”,“弱”
c =1×121 1 1 1 1 1 1 2 2 2⋯⋯

执行从节点4开始的图的深度优先搜索,并标记“edgetonew”,“edgetodiscovered”,“edgetofinished”,“startnode”事件。指定重新启动作为真正的以便在有无法到达的剩余节点时重新启动搜索。

事件= {“edgetonew”,“edgetodiscovered”,“edgetofinished”,“startnode”};T = dfsearch(G,4,事件,“重启”,真正的)
T =15×4表事件节点边EdgeIndex  ________________ ____ __________ _________ startnode 4南南南edgetonew南4 6 7 startnode 1南南南edgetonew南1 3 1 edgetonew南3 2 6 edgetonew南2 5 3 edgetofinished南2 6 4 edgetonew南2 7 5 edgetodiscovered南7 2 8 edgetofinished南1 4 2 startnode 8南南南edgetonew南8 9 9 edgetonew南8 10 10 edgetonew南8 11 11 edgetonew南8 12 12

重新启动真正的,“startnode”事件返回关于算法重新启动搜索的位置和时间的信息。

根据事件突出显示图表:

  • 将起始节点涂成红色。

  • 绿色边表示“edgetonew”

  • 黑边是“edgetofinished”

  • 洋红色的边是“edgetodiscovered”

突出(p,“边缘”T.EdgeIndex (T。事件= =“edgetonew”),“EdgeColor”,‘g’)突出(p,“边缘”T.EdgeIndex (T。事件= =“edgetofinished”),“EdgeColor”,“k”)突出(p,“边缘”T.EdgeIndex (T。事件= =“edgetodiscovered”),“EdgeColor”,“米”)突出(p, T.Node (~ isnan (T.Node)),“NodeColor”,“r”

通过反转有向图的一些边,使其成为无环图。

创建并绘制有向图。

S = [1 2 3 3 3 3 4 5 6 7 8 9 9 9 9 10];T = [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2];G =有向图(s,t);情节(g,“布局”,“力”

在图上执行深度优先搜索,标记“edgetodiscovered”事件。此事件对应于完成一个循环的边。

[e, edge_indexes] = dfsearch(g, 1,“edgetodiscovered”,“重启”,真正的)
e =3×23 1 6 4 8 7
edge_indices =3×13 9 11

使用flipedge反转标记边的方向,使它们不再完成一个循环。这将从图中删除所有的循环。使用isdag确认图是无环的。

Gnew = flipedge(g, edge_indices);isdag (gnew)
ans =逻辑1

绘制新图形并突出显示被翻转的边。

P = plot(gnew,“布局”,“力”);突出(p,“边缘”findedge (gnew e (:, 2), e (: 1)),“EdgeColor”,“r”

输入参数

全部折叠

输入图形,指定为a有向图对象。使用创建无向图或有向图创建有向图。

例子:G =图(1,2)

例子:G =有向图([1 2],[2 3])

起始节点,指定为之间的正标量整数1而且numnodes (G),或包含节点名称的字符向量。

例子:dfsearch (G, 1)

标记的搜索事件,指定为下表中的一个选项。

  • 要标记单个事件,请使用标记名称。

  • 若要标记事件子集,请在单元格数组中放入两个或多个标记名。

  • 要标记所有事件,使用“allevents”

请注意

的值事件,的输出dfsearch各不相同。有关每个选项返回的输出的信息,请参阅下表中的最后一列。

的价值事件 描述 输出
“discovernode”(默认)

已发现新节点。

返回一个节点id向量:

  • 如果年代是数值节点索引,则向量包含数值节点索引。

  • 如果年代是节点名,则向量是包含节点名的单元格数组。

“finishnode”

该节点的所有出边都已被访问。

“startnode”

该标志表示搜索中的开始节点。

如果“重启”真正的,然后“startnode”每次重新开始搜索时标记开始节点。

“edgetonew”

Edge连接到未发现的节点。

返回一个大小的矩阵或单元格数组N——- - - - - -2指定图中边的结束节点:

  • 如果年代是数值节点索引,则矩阵包含数值节点索引。

  • 如果年代是节点名称,则矩阵是包含节点名称的单元格数组。

此外,还可以指定第二个输出[T,E] = dfsearch(…)它返回一个由边下标组成的向量E

“edgetodiscovered”

Edge连接到先前发现的节点。

“edgetofinished”

Edge连接到已完成的节点。

单元阵列

在单元格数组中指定两个或多个标志,以便在搜索期间仅标记那些事件。

返回一个表,T,其中包含变量T.Event,T.Node,T.Edge,T.EdgeIndex

  • T.Event是一个类别向量,按出现的顺序包含标志。

  • T.Node包含事件对应节点的节点ID“discovernode”,“finishnode”,“startnode”

  • T.Edge包含事件的对应边“edgetonew”,“edgetodiscovered”,“edgetofinished”

  • T.EdgeIndex包含事件的边缘索引“edgetonew”,“edgetodiscovered”,“edgetofinished”。边缘索引用于唯一地识别多重图中的重复边。

  • 未使用的元素T.Node而且T.Edge设置为

  • 如果年代是数值节点索引,那么T.Node而且T.Edge包含数值节点索引。

  • 如果年代是节点名吗T.Node而且T.Edge是包含节点名称的单元格数组。

“allevents”

所有事件都被标记。

例子:v = dfsearch(G,3)从第三个节点开始搜索并返回一个向量,v,按照发现的顺序包含节点。这和v = dfsearch(G,3,'discovernode')

例子:X = dfsearch(G,'A',' edgetonnew ')从指定的节点开始“一个”并返回字符向量的单元格数组,X,表示搜索过程中连接到未发现节点的每条边。

例子:T = dfsearch(G,s,{'discovernode','finishnode'})返回一个表,T,但仅在发现新节点或标记节点已完成时标记。

例子:T = dfsearch(G,s,'allevents')标记所有搜索事件并返回一个表,T

数据类型:字符|细胞

名称-值对参数

的可选逗号分隔对名称,值参数。的名字参数名称和价值对应的值。的名字必须出现在单引号内(' ').您可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:v = dfsearch(G,s,'Restart',true)

全部折叠

切换以重新启动搜索,指定为(默认)或真正的。如果图中包含从起始节点无法到达的节点,则此选项非常有用。如果“重启”真正的,然后在仍然存在无法从已发现节点到达的未发现节点时重新开始搜索。新的开始节点是仍未发现的索引最小的节点。重新启动过程重复进行,直到dfsearch发现所有节点。

“重启”默认情况下,这样搜索只访问从开始节点可达的节点。

“重启”真正的,“discovernode”而且“finishnode”对于图中的每个节点,事件只发生一次。此外,图中的每条边都被标记了一次“edgetonew”,“edgetodiscovered”,或“edgetofinished”。被标记的边缘“edgetonew”形成一个或多个树。

例子:T = dfsearch(graph([1 3],[2 4]),1,'重启',true)在图中搜索两个连接的组件。

数据类型:逻辑

输出参数

全部折叠

节点id,格式为:

  • 如果使用数字节点ID指定起始节点,年代,然后v是节点索引的数值列向量。

  • 如果年代字符向量是否包含节点名v包含节点名称的单元格向量。

中的节点idv反映深度优先图搜索的发现顺序。

以下列格式返回的查册结果:

  • 如果事件未指定还是“discovernode”,“finishnode”,或“startnode”,然后T是节点id的向量,类似于v

  • 如果事件“edgetonew”,“edgetodiscovered”,或“edgetofinished”,然后T矩阵或单元格数组的大小N——- - - - - -2表示每个相关边的源节点和目标节点。

  • 如果事件是搜索事件的单元格数组还是“allevents”,然后T包含已标记的搜索事件的表。中包含搜索事件标志的表T.Event,中相关节点idT.Node,和相关的边T.Edge而且T.EdgeIndex

在所有情况下:

  • 元素或行的顺序T指示它们在搜索期间的出现顺序。

  • 如果你指定年代作为数值节点ID,则T也使用它们的数字id引用节点。

  • 如果你指定年代作为节点名T也使用节点名称引用节点。

边缘索引,作为一个向量返回。

指定此输出以获取事件的边缘索引向量“edgetonew”,“edgetodiscovered”,或“edgetofinished”。的N——- - - - - -1边指标的向量对应于T,这是一个大小的矩阵或单元格数组N——- - - - - -2表示每个相关边的源节点和目标节点。

例子:[T,E] = dfsearch(G,s,' edgetonnew ')

提示

  • dfsearch而且bfsearch将无向图视为有向图。节点之间的无向边年代而且t被处理成两条有向边,一条来自年代t还有一个来自t年代

算法

深度优先搜索算法从起始节点开始,年代,并检查的邻居年代它的节点索引最小。然后,对于该邻居,它检查下一个索引最低的未发现邻居。这一直持续下去,直到搜索遇到一个其所有邻居都被访问过的节点。此时,搜索将沿着路径回溯到之前发现的最近的节点,该节点具有未发现的邻居。这个过程将继续进行,直到访问了从开始节点可访问的所有节点为止。

在伪代码中,(递归)算法可以写成:

事件开始节点(S)调用DFS(S)函数DFS(C)事件发现节点(C) FOR边缘E从节点C的出边缘,连接到节点N事件edgetonnew (C,E), edgetodiscovered(C,E)或edgetofinished(C,E)(取决于节点N的状态)IF事件是edgetonnew调用DFS(N) END END事件结束节点(C) END

dfsearch可以返回标记来描述算法中的不同事件,例如当发现新节点时,或者当节点的所有出边都已被访问时。事件标志列在这里。

国旗事件 事件描述
“discovernode”

已发现新节点。

“finishnode”

该节点的所有出边都已被访问。

“startnode”

该标志表示搜索中的开始节点。

“edgetonew”

Edge连接到未发现的节点

“edgetodiscovered”

Edge连接到先前发现的节点

“edgetofinished”

Edge连接到已完成的节点

的输入参数描述,以获取更多信息事件

请注意

如果输入图包含从起始节点无法到达的节点,则使用“重启”选项提供了一种使搜索访问图中的每个节点的方法。在这种情况下,“startnode”Event表示每次重新开始搜索时的开始节点。

在R2015b中引入

这个话题有用吗?