前言
深度优先搜索属于图算法的一种,可以帮助使用者将所有点进行遍历,接下来让我们一起来进行学习~
一、深度优先搜索是什么?
深度优先算法,全称
D
e
p
t
h
F
i
r
s
t
S
e
a
r
c
h
Depth\ First\ Search
Depth First Search,简称为
D
F
S
DFS
DFS。其大概思想为:从一个节点开始,随机开始乱走,如果走不通了,则保存路径;之后逐步后退,直到能继续随机走;最终走完所有格点,则停止程序。
举例进行说明:
此图是一个无向图,如果我们从A点发起深度优先搜索(以下的访问次序并不是唯一的,第二个点既可以是B也可以是C,D),则我们可能得到如下的一个访问过程:A->B->E(没有路了!回溯到A)->C->F->H->G->D(没有路,最终回溯到A,A也没有未访问的相邻节点,本次搜索结束)。
以上内容参考自以下网址:
https://blog.csdn.net/weixin_42943114/article/details/104172146
https://baike.baidu.com/item/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2/5224976
二、深度优先搜索的基本思路即其matlab代码
1、深度优先搜索的基本思路
深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。
2、算法思想及其matlab代码
(1)标记一切边“未用过”,对任意顶点v,k(v) = 0。令i = 0,v = s。
(2)i = i + 1,k(v) = i。
(3)若v没有“未用过”的关联边,转5。
(4)选一条“未用过”的与v关联的边e = vu,标记e“用过”。若k(u) != 0,转3;否则,f(u) = v,v = u, 转2。
(5)若k(v) = 1,停止。
(6)v = f(v),转3。
其中,上述中的k(v)称为顶点v的DFS编码;f(v)称为顶点的父,v称为f(v)的子,且以f(v)为起始点、v为终点的有向边称为父子边。
%G表示图的邻接矩阵
%W表示图的边的访问顺序,按照顺序从小到大访问。
%K表示图的顶点标号
%f表示相应顶点的父亲顶点
function [W k f] = DFS3(G)
n = size(G,1);
W = G;
v = 1;
k = zeros(1,n);
f = zeros(1,n);
b = sum(sum(W == 1));
c = sum(k == 0);
d = 1;
if b == 0 & c == 0 & v == 1
d = 0;
end
k(1) = 1;
j = 2;
l = 2;
while d
a = find(W(v,:) == 1);
if isempty(a) & f(v) ~= 0
W(v,f(v)) = l;
l = l + 1;
v = f(v);
else
for i = 1:length(a)
if k(a(i)) == 0
k(a(i)) = j;
j = j + 1;
W(v,a(i)) = l;
l = l + 1;
f(a(i)) = v;
v = a(i);
break;
elseif k(a(i)) ~= 0
W(v,a(i)) = l;
l = l + 1;
end
end
end
b = sum(sum(W));
c = sum(k == 0);
if c == 0 & v == 1
d = 0;
end
end
W;
以上内容参考自以下网址:
https://blog.csdn.net/qq_43508527/article/details/89217460
总结
今天的学习就到这里,希望大家可以有所收获~