'''
深度优先遍历
首先遍历结果显然不唯一
'''
class Node():
def __init__(self,value):
self.value=value #对应数据
self.enter=0 #该节点的入度
self.out=0 #该节点的出度
self.nexts=[] #由该点发散出去的边(出去的边),直接相连的点
self.edges=[] #由该点发散出去的边
'''
这个设计囊括了图的大部分内容
'''
class Edge():
def __init__(self,weight,From,To):
'''
:param weight: 该边所具有的权重
:param From: 从那个点出发
:param To: 到达那条边
'''
self.weight=weight
self.From=From
self.To=To
class Graph():
def __init__(self):
self.nodes={} #创建一个空字典里面key:int value:Node
self.edges=set() #创建一个集合里面存放每一条边,同时每条边还有对应的属性
def dfs(node):
'''
基本思路:
1.入栈
2.创建集合set,防止重复走路,导致死循环和多余输出
3.开始大的循环,只要栈不为空就可以继续
4.开始小的循环,在node.nexts属性中找到想要的
注意这里要把cur和next都重新入栈(先入cur再入next)
并向set中添加next,以及打印next
:param node:
:return:
'''
if node==None:
return
stack=[node]
set={node}
print(node.val) #先直接打印了
while stack:#不为空进入循环
cur=stack.pop()
for item in cur.nexts:
if item not in set:#说明没有出现过
stack.append(cur)
stack.append(item)
'''
这是在干什么,首先添加cur是因为后面会强制结束循环,可能有相连元素没有遍历到,所以重新添加进去
在添加item是为了什么,是为了深度优先,继续往下面走着
'''
set.add(item)
print(item.val)
break
图的深度优先遍历
最新推荐文章于 2022-10-03 09:13:14 发布