主要内容

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

例子

全部崩溃

创建并绘制图表。

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

Figure包含axes对象。axes对象包含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)

Figure包含axes对象。axes对象包含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,“布局”“分层”);

Figure包含axes对象。axes对象包含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.Event==“edgetonew”),“EdgeColor”‘g’)突出显示(p,“边缘”,T.EdgeIndex(T.Event==“edgetofinished”),“EdgeColor”“k”)突出显示(p,“边缘”,T.EdgeIndex(T.Event==“edgetodiscovered”),“EdgeColor”“米”)突出显示(p,T.Node(~isnan(T.Node)),“NodeColor”“r”

Figure包含axes对象。axes对象包含graphplot类型的对象。

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

创建并绘制有向图。

s=[1234345678910];t=[7 6 1 5 6 8 2 4 4 3 7 1 6 8 2];g=有向图(s,t);图(g,“布局”“力”

Figure包含axes对象。axes对象包含graphplot类型的对象。

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

[e,edge_索引]=dfsearch(g,1,“edgetodiscovered”“重启”,真正的)
e =3×23 1 6 4 8 7
边缘指数=3×13 9 11

使用翻转边缘反转标记边的方向,使其不再完成一个循环。这将从图形中删除所有循环。使用isdag确认图形是非循环的。

gnew=翻转边缘(g,边缘索引);isdag(gnew)
ans =逻辑1

绘制新图形并高亮显示翻转的边。

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

Figure包含axes对象。axes对象包含graphplot类型的对象。

输入参数

全部崩溃

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

例子:图G =(1、2)

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

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

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

例子:dfsearch (G, 1)

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

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

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

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

请注意

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

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

发现新节点。

返回节点ID的向量:

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

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

“finishnode”

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

“startnode”

此标志指示搜索中的起始节点。

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

“edgetonew”

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

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

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

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

此外,还可以使用指定第二个输出[T,E]=dfsearch(…)返回边索引的向量E

“edgetodiscovered”

边缘连接到以前发现的节点。

“edgetofinished”

边连接到一个完成的节点。

单元阵列

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

返回一张桌子,T,其中包含变量T.事件T.节点T.边缘,及T.EdgeIndex

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

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

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

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

  • 未使用的元素T.节点T.边缘

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

  • 如果年代是节点名吗T.节点T.边缘是包含节点名称的单元格数组。

“allevents”

所有事件都被标记。

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

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

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

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

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

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

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

“重启”真的,“discornode”“finishnode”对于图中的每个节点,事件发生一次。此外,图中的每条边都会标记一次“edgetonew”“edgetodiscovered”“edgetofinished”.边缘标记为“edgetonew”形成一个或多个树。

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

数据类型:逻辑

输出参数

全部崩溃

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

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

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

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

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

  • 如果事件未指定,或者“discornode”“finishnode”“startnode”,然后T节点ID的向量类似于v

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

  • 如果事件是搜索事件的单元格数组还是“allevents”,然后T包含标记的搜索事件的表。表中包含搜索事件标志T.事件,对应的节点idT.节点,以及相关的边缘T.边缘T.EdgeIndex

在所有情况下:

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

  • 如果您指定年代作为数字节点ID,然后T也指使用其数字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可以返回标志来描述算法中的不同事件,例如发现新节点或访问节点的所有传出边缘时。此处列出了事件标志。

国旗事件 事件描述
“discornode”

发现新节点。

“finishnode”

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

“startnode”

此标志指示搜索中的起始节点。

“edgetonew”

边连接到未发现的节点

“edgetodiscovered”

Edge连接到以前发现的节点

“edgetofinished”

边连接到一个完成的节点

有关详细信息,请参见的输入参数说明事件

请注意

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

R2015b中引入