主要内容

dfsearch

图深度优先搜索

描述

例子

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

例子

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

TE) = dfsearch (G年代事件另外,返回边索引向量E事件被设置为“edgetonew”“edgetodiscovered”,或“edgetofinished”.在多图中,边指数是用来唯一标识边的。

例子

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

例子

全部折叠

创建并绘制图表。

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

图中包含一个轴对象。axis对象包含一个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)

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

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

T = dfsearch (G, 3,“allevents”
T =13×4表事件节点边EdgeIndex  ______________ ____ __________ _________ startnode 3 3南南南南南南discovernode edgetonew南3 4 4 discovernode南南南edgetonew南4 6 7 discovernode 6南南南finishnode 6南南南南南南edgetofinished finishnode 4南3 6 5 edgetonew南3 7 6 discovernode 7南南南finishnode 7 NaN南南finishnode 3 NaN NaN NaN

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

  1. 算法从节点3开始

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

  3. 发现节点4

  4. 等等……

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

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

S = [1 1 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,“布局”“分层”);

图中包含一个轴对象。axis对象包含一个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南南南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 edgetonnew南8 11 11 edgetonnew南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”

图中包含一个轴对象。axis对象包含一个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,“布局”“力”

图中包含一个轴对象。axis对象包含一个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”

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

输入参数

全部折叠

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

例子:图G =(1、2)

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

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

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

例子:dfsearch (G, 1)

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

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

  • 要标记事件的子集,请将两个或多个标记名称放入单元格数组或字符串数组中。

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

请注意

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

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

发现新节点。

返回一个节点id向量:

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

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

“finishnode”

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

“startnode”

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

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

“edgetonew”

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

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

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

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

此外,还可以指定第二个输出[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

  • 如果年代是数字节点索引吗T.NodeT.Edge包含数字节点索引。

  • 如果年代是节点名吗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(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.EdgeT.EdgeIndex

在所有情况下:

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

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

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

作为向量返回的边索引。

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

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

提示

  • dfsearchbfsearch将无向图与有向图同等对待。结点之间的无向边年代t就像两条有向边,一条来自年代t和一个来自t年代

算法

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

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

事件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