图(四):图的二维矩阵的深度优先搜索和广度优先搜索

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_41611045/article/details/102679208

一、深度优先搜索在这里插入图片描述
按照上面的思路我们进行深度优先搜索的代码实现:
在这里插入图片描述
递归版:

'''
深度优先遍历:dfs
先进入图的一个节点,并标记已访问,然后选择该节点一个节点继续访问,
直到进入的节点中所有相邻节点全被访问过,进入回溯操作,
直到将所有节点访问结束
'''
matrix=[[-1,5,-1,-1,-1,2],
        [-1,-1,4,-1,-1,-1],
        [-1,-1,-1,9,-1,-1],
        [-1,-1,-1,-1,7,3],
        [1,-1,-1,-1,-1,-1],
        [-1,-1,1,-1,8,-1]]
n=len(matrix[0])
i=0
def DFS_arr(matrix,i):
    visited=[]
    arr=[]
    def dfs(matrix,visited,n,arr,i=0):
        #visited=[] 记录已经访问过的节点
        #arr=[] 记录深度优先搜索的轨迹
        #print(visited)
        if i not in visited:
            visited.append(i)
            arr.append(i)
            for j in range(n): #搜索相邻节点
                if matrix[i][j]!=-1 and j not in visited: #如果相邻节点没有被访问过,进行深度优先搜索
                    #arr.append([i])#,j,matrix[i][j]])
                    dfs(matrix,visited,n,arr,j)
        return arr
    return dfs(matrix,visited,n,arr,i=i)
DFS_arr(matrix,i=0)
DFS_arr(matrix,i=1)

结果:
[0, 1, 2, 3, 4, 5]
[1, 2, 3, 4, 0, 5]
非递归版本:

'''
非递归版本可以用栈来实现深度优先搜索,
(1)利用一个数组来记录哪些顶点被访问过
(2)利用栈这个辅助数组来实现深度优先遍历,每次向栈中加入一个元素,元素弹出后加入与这个顶点相连的所有顶点
,继续从中弹出一个(相当于从中选择了一个未知顶点),继续弹出直到栈为空为止,因为每一次元素弹出都要比较以下这个
    元素是否已经被访问过,所以相当于进行了回溯的操作)
'''
matrix=[[-1,5,-1,-1,-1,2],
        [-1,-1,4,-1,-1,-1],
        [-1,-1,-1,9,-1,-1],
        [-1,-1,-1,-1,7,3],
        [1,-1,-1,-1,-1,-1],
        [-1,-1,1,-1,8,-1]]
def dfs_arr(matrix,i):
    n=len(matrix[0])
    visited=[]
    #i=0
    def dfs(matrix,n,i,visited):
        #n 顶点个数
        #i 最开始要遍历的顶点起始位置
        arr=[] #进行深度优先遍历
        path=[] #记录深度优先按遍历的结果
        arr.append(i)
        while arr:
            #print(arr)
            vertix=arr.pop()
            if vertix not in visited:
                visited.append(vertix)
                path.append(vertix)
                set1=matrix[vertix]
                for j in range(n-1,-1,-1):#让元素能够按照原本的逆序入栈,顺序出栈             
                    if set1[j]!=-1: #找到其相邻的顶点
                         arr.append(j)
        return path
    return dfs(matrix,n,i,visited) 
dfs_arr(matrix,i=0)               
dfs_arr(matrix,i=1)    

[0, 1, 2, 3, 4, 5]
[1, 2, 3, 4, 0, 5]

猜你喜欢

转载自blog.csdn.net/weixin_41611045/article/details/102679208