【发布时间】:2012-12-14 17:17:19
【问题描述】:
我有以下 Python 代码,它与有向图完美配合。 我的问题是如何修改代码以找到所有路径 忽略边缘的方向。
例如,如果我们有以下连接:
1->2
3->2
我的代码不会返回 1 和 3 之间的路径,这是预期的,因为它是定向的。但是忽略边缘的方向,代码应该找到从 1 到 3 的路径。
我希望代码忽略方向并找到两个给定节点之间的所有路径。
我尝试了建议的解决方案,它的效果非常好,解决方案是:“最简单的解决方案可能是通过为每个 A->B 添加弧 B->A 来预处理您的图形图表。"
我真正想要的是修改算法本身以按原样处理图形。
Python 代码:
# 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 中的相同问题有解决方案
【问题讨论】:
-
这更像是一个基于算法的问题,您是否在 google 上搜索过?
-
是的,我一直在寻找任何可以解决问题的算法。我发现了很多,我找不到一个可以使用无向图来找到两个节点之间的所有路径的。例如:所有最短路径、BFS、DFS 等。它们都使用有向边作为问题中的边。
-
为什么不使用现有的解决方案,例如
networkx和igraph,或者您只想使用您的代码? -
@Namit Kewat,老实说,我没有尝试 networkx 或 igraph,因为在我的搜索中,我在他们的文档中找不到任何算法线索来查找无向图中的所有路径。
-
查看这篇文章以获得解决方案;它同时使用
igraph和networkx模块:stackoverflow.com/questions/2606018/…
标签: java python graph python-2.7 graph-algorithm