深度优先搜索(DFS)及其matlab代码


前言

  深度优先搜索属于图算法的一种,可以帮助使用者将所有点进行遍历,接下来让我们一起来进行学习~


一、深度优先搜索是什么?

  深度优先算法,全称 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

总结

  今天的学习就到这里,希望大家可以有所收获~

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值