如字典表示该节点与其他节点的连通关系,
dct={
'A':['B','C','D','E'],
'B':['C','F','H'],
'C':['F'],
'D',['H','I'],
'E',['K'],
'K',['F']
}
如何运用深度遍历算法,输入始发点,目的点,最大步长,得出俩点间的所有路径?
例:输入始发点A,目的点F,步长4,得出路径A-B-F、A-C-F、A-E-K-F
输入始发点A,目的点F,步长3,得出路径A-B-F、A-C-F
输入始发点A,目的点C,步长任意,得出路径A-C
# 定义函数find_path,它接受四个参数:起点、终点、步长、字典
def find_path(start, end, max_steps, dct):
# 定义变量paths,用来存储所有满足要求的路径
paths = []
# 定义函数dfs,它接受三个参数:当前节点、当前步数、当前路径
def dfs(node, steps, path):
# 如果当前步数已经超过最大步长,直接返回
if steps > max_steps:
return
# 如果当前节点已经是终点,把当前路径添加到
所有满足要求的路径中
if node == end:
paths.append(path)
return
# 遍历当前节点的所有相邻节点
for next_node in dct[node]:
# 如果下一个节点已经在当前路径中出现过,跳过它
if next_node in path:
continue
# 如果没有出现过,继续搜索下一个节点
dfs(next_node, steps + 1, path + [next_node])
开始搜索
dfs(start, 0, [start])
返回所有满足要求的路径
return paths
测试函数
dct = {
'A': ['B', 'C', 'D', 'E'],
'B': ['C', 'F', 'H'],
'C': ['F'],
'D': ['H', 'I'],
'E': ['K'],
'K': ['F']
}
print(find_path('A', 'F', 4, dct)) # 输出 [['A', 'B', 'F'], ['A', 'C', 'F'], ['A', 'E', 'K', 'F']]
print(find_path('A', 'F', 3, dct)) # 输出 [['A', 'B', 'F'], ['A', 'C', 'F']]
print(find_path('A', 'C', 100, dct)) # 输出 [['A', 'C']]
上面的代码实现了一个深度优先搜索算法,它可以用来搜索从起点到终点的路径,并根据给定的最大步长筛选符合要求的路径。希望这些内容能够帮助到你。
下面是一个完整的代码实现和注释讲解,望采纳
# 定义字典,表示该节点与其他节点的连通关系
dct = {
'A': ['B', 'C', 'D', 'E'],
'B': ['C', 'F', 'H'],
'C': ['F'],
'D': ['H', 'I'],
'E': ['K'],
'K': ['F']
}
# 定义函数,用于深度遍历
def dfs(graph, start, end, step, path):
# 如果已经遍历到目的节点,则将路径输出
if start == end:
print(path)
return
# 如果还没有遍历到目的节点,则继续遍历
if step > 0:
# 获取当前节点的所有连通节点
for node in graph[start]:
# 遍历连通节点,并更新路径
dfs(graph, node, end, step - 1, path + [node])
# 输入始发点、目的点、步长
start = input('请输入始发点:')
end = input('请输入目的点:')
step = int(input('请输入步长:'))
# 调用函数,进行深度遍历
dfs(dct, start, end, step, [start])
求两点间的所有路径算法
如有帮助,望采纳
"""defgraph.py"""
'''
class Vertex(object):
def __init__(self,name):
self.name = name
self.adjs = []
self.adjsname = []
self.isdestn = 0
def look_adjs(self):
L = []
for v in self.adjs:
L.append(v.name)
print(L)
class Edge(object):
def __init__(self,v,u):
self.relevances = {v.name:v.adjs, u.name:u.adjs}
def look_relevances(self):
L = []
for vname in self.relevances.keys():
L.append(vname)
print(L)
'''
class Graph(object):
'''undirected unweighted graph'''
def __init__(self):
self.VertexNumber = int(0)
self.EdgeNumber = int(0)
self.VertexSet = {}
self.EdgeSet = []
self.origin = None
self.destn = None
self.O2DPathNum = int(0)
def insert_vertex(self,vertex):
self.VertexSet.setdefault(vertex,[])
def insert_edge(self,v,u):
edge = set([v, u])
if not (edge in self.EdgeSet):
self.EdgeSet.append(edge)
'''establish adjacency relationship'''
if not (u in self.VertexSet[v]):
self.VertexSet[v].append(u)
if not (v in self.VertexSet[u]):
self.VertexSet[u].append(v)
def get_adjs(self,vertex):
if vertex in self.VertexSet.keys():
return self.VertexSet[vertex]
else:
print('{} is not in VertexSet'.format(vertex))
def look_VertexSet(self):
L = []
for v in self.VertexSet.keys():
L.append(v)
print(L)
def look_EdgeSet(self):
print(self.EdgeSet)
'''All paths of two vertexs.py'''
import string
from defgraph import *
def initialize_graph(G):
with open('test-5.txt','r') as f:
G.EdgeNumber = int(f.readline().strip())
G.VertexNumber = int(f.readline().strip())
'''
create the EdgeSet and the VertexSet
notes:enumerate can get the loop count'
'''
for i,line in enumerate(f.readlines()):
if i == G.EdgeNumber:
G.origin = line.strip()
elif i == G.EdgeNumber + 1:
G.destn = line.strip()
else:
u,v = line.strip().split()
G.insert_vertex(v)
G.insert_vertex(u)
G.insert_edge(v,u)
def search_path():
global path
path = []
path.append(G.origin)
visit(G.origin)
print("Path Number:{}".format(G.O2DPathNum))
def visit(vertex):
v_adjs = G.get_adjs(vertex)
'''whether vertex has adjacences'''
if v_adjs:
for u in v_adjs:
if u == G.destn:
print(''.join([v for v in path]) + u)
G.O2DPathNum += 1
elif not (u in path):
path.append(u)
visit(u)
'''loop end means that node 'u' has been explored'''
path.pop()
def main():
global G
G = Graph()
initialize_graph(G)
'''
G.look_VertexSet()
G.look_EdgeSet()
print(G.get_adjs('A'))
'''
search_path()
if __name__ == "__main__":
main()
解决代码如下:
from itertools import groupby
def findAllPath(graph, start, end, path=[]):
# path.append(start)
path = path + [start]
if start == end:
return path
for node in graph[start]:
if node not in path:
newpaths = findAllPath(graph, node, end, path)
for newpath in newpaths:
if newpath == end:
path.append(newpath)
paths.append(path)
return paths
def get_graph(graph_dict):
# 打散, 获取相关的两个点
t = [(kvs[0], v) for kvs in graph_dict.items() for vs in kvs[1] for v in vs]
# 反转两个点, 获取2个点的相互关系
t_re = [(t2[1], t2[0]) for t2 in t]
t.extend(t_re)
# 聚合得到每个点的下个点
t_g = groupby(sorted(t, key=lambda x: x[0]), key=lambda x: x[0])
# 每个点的所有直接连接点
t_dict = {k: [v[1] for v in list(vs)] for k, vs in t_g}
return t_dict
if __name__ == '__main__':
graph = {
'A': ['B', 'C', 'D', 'E'],
'B': ['C', 'F', 'H'],
'C': ['F'],
'D': ['H', 'I'],
'E': ['K'],
'K': ['F']
}
t_dict = get_graph(graph)
start, end, step = 'A', 'F', 4
paths = [] # 存储所有路径
findAllPath(t_dict, start, end)
# print(paths)
# 步长过滤
paths_result = ['-'.join(p) for p in paths if len(p) <= step]
print(f'start: {start}, end: {end}, step: {step}, result: {paths_result}')
start, end, step = 'A', 'F', 3
paths = [] # 存储所有路径
findAllPath(t_dict, start, end)
paths_result = ['-'.join(p) for p in paths if len(p) <= step]
print(f'start: {start}, end: {end}, step: {step}, result: {paths_result}')
start, end, step = 'A', 'C', None
paths = [] # 存储所有路径
findAllPath(t_dict, start, end)
paths_result = ['-'.join(p) for p in paths]
print(f'start: {start}, end: {end}, step: {step}, result: {paths_result}')
打印结果:
start: A, end: F, step: 4, result: ['A-B-C-F', 'A-B-F', 'A-C-F', 'A-E-K-F']
start: A, end: F, step: 3, result: ['A-B-F', 'A-C-F']
start: A, end: C, step: None, result: ['A-B-C', 'A-C']
Process finished with exit code 0