在图中查找顶点的可到达顶点

时间:2010-12-14 22:53:08

标签: python

我在代码中遇到问题,无法计算图表中可到达的顶点。

我有图表的以下代码

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:这不是一个以学校为基础的作业......

3 个答案:

答案 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是什么吗?粗略地说,你从一个顶点开始并选择一个邻居,然后选择一个邻居,依此类推,直到你的邻居用完为止。然后你回溯并选择下一个邻居,依此类推。它是优雅地递归实现的(你之前遇到过吗?),因为问题可以很容易地分成更小的部分:搜索图形深度 - 首先你只需从任何顶点开始,然后深度优先搜索它的所有邻居转动。

具体而言,您需要将问题分解为更小的问题:假设您可以找到可从bc到达的节点。你能从a得到什么?好吧,b,一切都可以从bc到达,一切都可以从c到达。