我在代码中遇到问题,无法计算图表中可到达的顶点。
我有图表的以下代码
class Vertices():
number = 0
def __init__(self):
Vertices.number += 1
self.number = Vertices.number
self.Reachable= []
我按以下方式创建图表
a = Vertices()
a.Reachable = [1,2]
b = Vertices()
b.Reachable = [3]
c = Vertices()
c.Reachable= [3]
List = []
List.append(a)
List.append(b)
List.append(c)
因此,作为a的顶点1具有自身的边缘和b。同样适用于b和c。
我们可以使用List移动图形,即顶点a可以到达List [trans-1],其中trans指的是Reachable list of a (List[0] and List[1])
现在在这个图中我必须计算每个顶点的可达性,即每个顶点计算它可以到达的顶点。例如a可以到达a,b和c
我已经读过,我可以使用集合在所有列表中进行深度优先搜索。你能否为我提供一个如何进行的解决方案。
任何人都可以告诉我如何使用集合,因为我认为它是非常理想的这个问题,因为它有与它相关的联合和差异函数.... PS:这不是一个以学校为基础的作业......
答案 0 :(得分:2)
如何在问题中使用well-known solution?
首先,您需要图表的数据结构。您可以将其作为列表的字典来执行,其中每个顶点都表示为键,可达顶点是列表值。
graph = {'A': ['B', 'C'],
'B': ['C', 'D'],
'C': ['D'],
'D': ['C'],
'E': ['F'],
'F': ['C']}
如果您如上所示表示图形,则找到B的相邻顶点将只是
neighbours_of_B = graph['B']
和(来自同一网站) 找到没有周期的所有路径将是:
def find_all_paths(graph, start, end, path=[]):
path = path + [start]
if start == end:
return [path]
if not graph.has_key(start):
return []
paths = []
for node in graph[start]:
if node not in path:
newpaths = find_all_paths(graph, node, end, path)
for newpath in newpaths:
paths.append(newpath)
return paths
并将其运行为:
find_all_paths(graph, 'A', 'D')
希望有所帮助。
在上面的链接中阅读更多相关信息。
答案 1 :(得分:1)
为什么不使用NetworkX或任何其他图表库?
您目前的陈述不起作用。如何将任何函数从数字2
转到顶点b
?您需要添加实际对象,而不仅仅是它们的编号。
一旦你这样做,你可以做这样的事情:
def reachable( start ):
# the set of reachable nodes
reachable = set()
# recursive function to add all reachable nodes to `reachable`
def finder(node):
reachable.add(node.)
for other in node.Reachable:
finder(other)
# add everything we can reach from here
finder(start)
return reachable
答案 2 :(得分:0)
首先是Vertex
,而不是Vertice
。其次,您(大致)实现了adjacency list作为图表的数据结构;使用adjacency matrix会更加标准。
你知道depth-first search是什么吗?粗略地说,你从一个顶点开始并选择一个邻居,然后选择一个邻居,依此类推,直到你的邻居用完为止。然后你回溯并选择下一个邻居,依此类推。它是优雅地递归实现的(你之前遇到过吗?),因为问题可以很容易地分成更小的部分:搜索图形深度 - 首先你只需从任何顶点开始,然后深度优先搜索它的所有邻居转动。
具体而言,您需要将问题分解为更小的问题:假设您可以找到可从b
和c
到达的节点。你能从a
得到什么?好吧,b
,一切都可以从b
,c
到达,一切都可以从c
到达。