主要内容

dfsearch

图深度优先搜索

描述

例子

V.= dfsearch (GS.适用深度优先搜索到图G从节点S..其结果是节点ID的在他们的发现顺序的载体。

例子

T.= dfsearch (GS.事件通过标记一个或多个搜索事件,定制深度优先搜索的输出。例如,T = dfsearch (G s allevents)返回包含所有标记事件的表X = dfsearch (G s edgetonew)返回边缘的基质或单元阵列。

[T.E.) = dfsearch (GS.事件另外,返回边索引向量E.事件被设置为“edgetonew”'edgetodiscovered',或'edgetofinished'.边缘指数用于在多重图边缘的唯一标识。

例子

[___) = dfsearch (___,'重新开始',特遣部队,在那里特遣部队真正的,如果从已发现的节点无法到达新节点,则重新启动搜索。您可以在前面的语法中使用任何输入或输出参数组合。该选项确保深度优先搜索到达图中的所有节点和边,即使从起始节点无法到达它们,S.

例子

全部折叠

创建并绘制图表。

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

图包含一个轴。轴包含类型graphplot的对象。

执行深度优先搜索开始节点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 1 1 1;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 =有向图(一个);图(G)

图包含一个轴。轴包含类型graphplot的对象。

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

T = dfsearch (G, 3,'allevents'
T =13×4表事件节点边缘EdgeIndex ______________ ____ __________ _________的StartNode 3的NaN楠楠discovernode 3的NaN楠楠edgetonew的NaN 3 4 4 discovernode 4的NaN楠楠edgetonew的NaN 4 6 7 discovernode 6的NaN楠楠finishnode 6的NaN楠楠finishnode 4的NaN楠楠edgetofinished的NaN3 6 5 edgetonew的NaN 3 7 6 7 discovernode楠楠的NaN finishnode 7楠楠的NaN 3 finishnode楠楠的NaN

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

  1. 算法从节点3开始

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

  3. 发现节点4

  4. 等等……

执行深度优先搜索具有多个组件的曲线图,并且然后突出显示基于该搜索结果的所述图形节点和边。

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

S = [1 1 2 2 2 3 4 7 8 8 8 8];T = [3 4 7 5 6 2 6 2 9 10 11 12];G =有向图(S,T);P =情节(G,'布局'“分层”);

图包含一个轴。轴包含类型graphplot的对象。

C = conncomp(G,“类型”“弱”
c =1×121 1 1 1 1 1 1 2 2 2 2 2

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

事件= {“edgetonew”'edgetodiscovered''edgetofinished'“startnode”};T = dfsearch(G,4,事件“重启”,真正的)
T =15×4表事件节点边缘EdgeIndex ________________ ____ __________ _________的StartNode 4的NaN楠楠edgetonew的NaN 4 6 7的StartNode 1的NaN楠楠edgetonew的NaN 1 3 1 edgetonew的NaN 3 2 6 edgetonew的NaN 2 5 3 edgetofinished的NaN 2 6 4 edgetonew的NaN 2 7 5 edgetodiscovered的NaN7 2 8 edgetofinished的NaN 1 4 2的StartNode 8的NaN楠楠edgetonew的NaN 8 9 9 edgetonew的NaN 8 10 10 edgetonew的NaN 8 11 11 edgetonew的NaN 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'

图包含一个轴。轴包含类型graphplot的对象。

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

创建并绘制有向图。

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

图包含一个轴。轴包含类型graphplot的对象。

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

[e,edge_indices] = dfsearch(g, 1, d)'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 =情节(gnew,'布局'“力”);亮点(P,“边缘”findedge (gnew e (:, 2), e (: 1)),'EdgeColor''R'

图包含一个轴。轴包含类型graphplot的对象。

输入参数

全部折叠

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

例子:图G =(1、2)

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

开始节点,指定为该表中的值之一。

价值 例子
标量节点索引 1
字符向量节点名 “一个”
字符串标量节点名 “一个”

例子:dfsearch (G, 1)

标记搜索活动,指定为下表中的选项之一。

  • 为了标记单个事件,使用该标志的名称。

  • 为了标志事件的子集,将两个或多个标志的名称为一个单元阵列或字符串数​​组。

  • 要标记所有事件,请使用'allevents'

笔记

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

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

发现新节点。

返回一个节点id向量:

  • 如果S.是数字节点索引,则向量包含数字节点索引。

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

“finishnode”

所有从节点发出的边都被访问过。

“startnode”

这个标志表示搜索的开始节点。

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

“edgetonew”

边缘连接到一个未被发现的节点。

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

  • 如果S.是数字节点索引,则矩阵包含数字节点索引。

  • 如果S.是节点名,则矩阵是包含节点名称的单元阵列。

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

'edgetodiscovered'

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

'edgetofinished'

边缘连接到一个成品节点。

单元阵列

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

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

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

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

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

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

  • 未使用的元素T.NodeT.Edge为NaN

  • 如果S.是数字节点索引,则T.NodeT.Edge包含数字节点索引。

  • 如果S.是节点名吗T.NodeT.Edge是包含节点名称的单元格数组。

'allevents'

所有事件都被标记。

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

例子:X = dfsearch(G, 'A', 'edgetonew')始于命名节点“一个”并返回字符向量的单元阵列,X指示每个所述搜索期间连接到一个未被发现节点的边。

例子:T = dfsearch(G,S,{ 'discovernode', 'finishnode'})返回一个表,T.,但只在发现新节点或标记某个节点完成时使用标记。

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

数据类型:字符|字符串|细胞

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

“重启”错误的默认情况下,搜索只访问从起始节点可达的节点。

“重启”真正的, 这“discovernode”“finishnode”事件发生一次图表中的每个节点。另外,在图中的每个边缘被标记一旦被“edgetonew”'edgetodiscovered',或'edgetofinished'.边缘标记为“edgetonew”形成一个或多个树。

例子:T = dfsearch(图([1 3],[2-4]),如图1所示, '重新启动',真)将搜索两个图中的连接部件。

数据类型:逻辑

输出参数

全部折叠

节点id,以下列格式之一返回:

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

  • 如果S.字符向量或字符串是否包含节点名V.包含节点名的单元格向量。

中的节点idV.通过深度优先的图搜索来反映发现的顺序。

搜索结果,以下列格式之一返回:

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

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

  • 如果事件是搜索事件的单元阵列或'allevents', 然后T.包含标记的搜索事件的表。表中包含搜索事件标志T.Event,对应的节点idT.Node,以及相关的边缘T.EdgeT.EdgeIndex

在所有情况下:

  • 的元素或行的顺序T.指示它们在搜索过程中出现的顺序。

  • 如果您指定S.作为一个数字节点IDT.也引用使用其数字id的节点。

  • 如果您指定S.作为节点名T.也指用自己的名字节点。

边索引,返回作为载体。

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

例子:[T E] = dfsearch (G,年代,“edgetonew”)

提示

  • dfsearchbfsearch将无向图与有向图同等对待。结点之间的无向边S.T.被处理像两个有向边,从一个S.T.和一个从T.S.

算法

深度优先搜索算法从起始节点开始,S.,并检查邻居S.具有最小节点索引。那么该邻居,它会检查其索引的下一个未被发现的邻居。这样继续下去,直到搜索遇到其邻居都被访问过的节点。在这一点上,沿路径有一个未被发现的邻居最近先前发现的节点搜索回溯。这个过程一直持续,直到可达从起始节点的所有节点都被访问。

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

事件startnode (S)调用DFS (S)函数DFS (C)事件discovernode (C)边缘E C从外向的边缘节点,连接节点N事件edgetonew (C、E), edgetodiscovered (C、E)或edgetofinished (C, E)(取决于节点N)的状态如果事件是edgetonew叫DFS (N)结束结束事件finishnode (C)

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

事件标志 事件描述
“discovernode”

发现新节点。

“finishnode”

所有从节点发出的边都被访问过。

“startnode”

这个标志表示搜索的开始节点。

“edgetonew”

边缘连接到未发现的节点

'edgetodiscovered'

Edge连接到以前发现的节点

'edgetofinished'

边缘连接到一个成品节点

有关的更多信息,请参见输入参数描述事件

笔记

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

介绍了R2015b