我有以下 Python 代码,它与有向图完美配合。我的问题是如何修改代码以找到所有路径而忽略边缘的方向。
例如,如果我们有以下连接:
1->2
3->2
我的代码不会返回 1 到 3 之间的路径,这是预期的。但是忽略边缘的方向,代码应该找到从 1 到 3 的路径。
我希望代码忽略方向并找到两个给定节点之间的所有路径。
我尝试了建议的解决方案,它的效果非常好,解决方案是:“最简单的解决方案可能是通过为图中的每个 A->B 添加弧 B->A 来预处理您的图表。 ”
我真正想要的是修改算法本身以按原样处理图形。
蟒蛇代码:
# a sample graph
graph = {'A': ['B', 'C','E'],
'B': ['A','C', 'D'],
'C': ['D'],
'D': ['C'],
'E': ['F','D'],
'F': ['C']}
class MyQUEUE: # just an implementation of a queue
def __init__(self):
self.holder = []
def enqueue(self,val):
self.holder.append(val)
def dequeue(self):
val = None
try:
val = self.holder[0]
if len(self.holder) == 1:
self.holder = []
else:
self.holder = self.holder[1:]
except:
pass
return val
def IsEmpty(self):
result = False
if len(self.holder) == 0:
result = True
return result
path_queue = MyQUEUE() # now we make a queue
def BFS(graph,start,end,q):
temp_path = [start]
q.enqueue(temp_path)
while q.IsEmpty() == False:
tmp_path = q.dequeue()
last_node = tmp_path[len(tmp_path)-1]
#print tmp_path
if last_node == end:
print "VALID_PATH : ",tmp_path
for link_node in graph[last_node]:
if link_node not in tmp_path:
new_path = []
new_path = tmp_path + [link_node]
q.enqueue(new_path)
BFS(graph,"A","D",path_queue)
-------------代码的输出--------
['A', 'B', 'D']
['A', 'C', 'D']
['A', 'E', 'D']
['A', 'B', 'C', 'D']
['A', 'E', 'F', 'C', 'D']
注意:我标记了 Java,以防有人对 Java 中的相同问题有解决方案