// B=所有边界点构成的集合
B.Push(s);
WHILE B非空
d=B.Pop();
将d标记为“已探索”;
FOR d的所有邻居t
IF t的标记为“未探索”
B.Push(t);
ENDFOR
ENDWHILE
2.BFS伪代码
// B=所有边界点构成的集合
B.EnQueue(s);
WHILE B非空
d=B.DeQueue();
将d标记为“已探索”;
FOR d的所有邻居t
IF t的标记为“未探索”
B.EnQueue(t);
ENDFOR
ENDWHILE
二.代码实现DFS
1.DFS.py
import Graph
# 从文件中构图
def build_graph(file_path,graph):
f = open(file_path,"r")
for i in f.readlines():
a,b =i.split()
graph.insert(int(a),int(b))
f.close()
# 寻找所有路径
def findpath(graph,startnode,destinationnode):
visited={} #创建一个字典,key值表示相应的结点,value值取0,1代表标记和未标记
path=[] #路径
for i in graph.getnodes(): #所有结点初始化未标记
visited[i]=0
DFS(graph,visited,startnode,destinationnode,path) # 调用DFS
# DFS
def DFS(graph,visited,v,destinationnode,path):
visited[v]=1 # 标记为已访问
path.append(v) #加入path
if v==destinationnode: # 如果节点v是目的节点,那么输出此路径
for i in range(len(path)):
if i!=len(path)-1:
print(path[i],end="-")
else:
print(path[i])
path.pop(len(path) - 1)
visited[v] = 0 #v是目标结点,将v从路径中弹出,并重新设置为未标记
else:
for m in graph.succ(v): #访问v的未探索的邻接结点,并进行DFS
if visited[m]==0:
DFS(graph,visited,m,destinationnode,path)
path.pop(len(path)-1) #v的邻接结点全部被探索过,将v从路径中弹出
visited[v]=0
2.Graph.py
class Graph(object):
def __init__(self):
self.nodes = []
self.edges = {}
# 返回该节点的所有邻接节点(边)
def succ(self, node):
return self.edges[node]
# 返回节点个数
def get_node_num(self):
return len(self.nodes)
# 增加边
def insert(self, node_a, node_b):
if not(node_a in self.nodes):
self.nodes.append(node_a)
self.edges[node_a] = list()
if not(node_b in self.nodes):
self.nodes.append(node_b)
self.edges[node_b] = list()
if not(node_b in self.edges[node_a]):
self.edges[node_a].append(node_b)
if not(node_a in self.edges[node_b]):
self.edges[node_b].append(node_a)
#获取点集
def getnodes(self):
return self.nodes