深度优先遍历(Depth First Search)的主要思想是:
思想:不撞南墙不回头
1、首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;
2、当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。
邻接表表示:
在这里我们采用数组+链表(头插法)表示邻接表
# a和b存在一条边 def add(a,b): e[idx] = b # e数组存放值 nxt[idx] = h[a] # nxt存放下一个节点位置 h[a] = idx # h 表示节点数组 idx += 1 # 每个节点对应的唯一索引核心算法:
# u 表示 访问的节点 def dfs(u) st[u] = True # st 标记数组 标记节点是否访问 i = h[u] while i != -1: j = e[i] if !st[j]: dfs(j) i = nxt[i]完整算法:
import numpy as np def main(): global e,nxt,h,idx,st idx = 0 n = int(input("请输入整数n:")) e = np.full((n,),-1,dtype=int) nxt = np.full((n,),-1,dtype=int) h = np.full((100,),-1,dtype=int) st = np.full((100,),False,dtype=bool) #标记数组 m = n-1 while m: a = int(input("请输入a:")) b = int(input("请输入b:")) add(a,b) m -= 1 dfs(1) # 头插法建立链表 def add(a,b): global idx e[idx] = b nxt[idx] = h[a] h[a] = idx idx += 1 # 深度优先 def dfs(u): st[u] = True i = h[u] while i!=-1: j = e[i] if st[j] == False: dfs(j) i = nxt[i] if __name__ == '__main__': main()