方法一,通过回溯查找
假如我们要查找的图为:
通过一个字典进行保存:
graph = {"A":["B","C"],
"B":["A","C","D"],
"C":["A","B","D","E"],
"D":["B","C","E","F"],
"E":["C","D"],
"F":["D"],
} #用一个字典保存图
求任意两点之间所有路径:
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
输入:
paths = [] #存储所有路径
path=findAllPath(graph,"A","F")
输出:[['A', 'B', 'C', 'D', 'F'],
['A', 'B', 'C', 'E', 'D', 'F'],
['A', 'B', 'D', 'F'],
['A', 'C', 'B', 'D', 'F'],
['A', 'C', 'D', 'F'],
['A', 'C', 'E', 'D', 'F']]
方法二、由图的邻里表进行查找
程序如下:
def findAllPath(graph,start,end):
path=[]
stack=[]
stack.append(start)
visited=set()
visited.add(start)
seen_path={}
#seen_node=[]
while (len(stack)>0):
start=stack[-1]
nodes=graph[start]
if start not in seen_path.keys():
seen_path[start]=[]
g=0
for w in nodes:
if w not in visited and w not in seen_path[start]:
g=g+1
stack.append(w)
visited.add(w)
seen_path[start].append(w)
if w==end:
path.append(list(stack))
old_pop=stack.pop()
visited.remove(old_pop)
break
if g==0:
old_pop=stack.pop()
del seen_path[old_pop]
visited.remove(old_pop)
return path
输入:
path=findAllPath(graph,"A","F")
输出:
[{'A', 'B', 'C', 'D', 'F'},
{'A', 'B', 'C', 'D', 'E', 'F'},
{'A', 'B', 'D', 'F'},
{'A', 'B', 'C', 'D', 'F'},
{'A', 'C', 'D', 'F'},
{'A', 'C', 'D', 'E', 'F'}]
#因为后面要比较相同点的路径只去一条所以把结果用一个集合保存 最开始用list保存有问题。
求解图的最短路径算法:
Floyd算法
Dijkstra算法