【问题标题】:Python Depth First Search with Dict使用字典的 Python 深度优先搜索
【发布时间】:2017-10-07 07:05:14
【问题描述】:

我不断看到深度优先搜索的伪代码,它与我的具体问题的关系完全让我感到困惑。我正在尝试确定“有向图”是否是强连接的。

如果我有一个包含 2 个字符串(第一个表示源,第二个表示目标)和一个表示边缘权重的可选数字的 dict:

{'Austin': {'Houston': 300}, 'SanFrancisco':  {'Albany': 1000}, 'NewYorkCity': { 'SanDiego': True }}

如何实现 DFS 的一些元素?我知道我可以从顶点“Austin”开始,而“Houston”是另一个顶点。但我看不出这在 Python 代码中是如何工作的

就像我有这个伪代码:

function graph_DFS(start):
    # Input: start vertex
    S = new Stack()
    # Mark start as visited
    S.push(start)
    while S is not empty:
        node = S.pop()
        # Do something? (e.g. print)
        for neighbor in node’s adjacent nodes:
            if neighbor not visited:
                # Mark neighbor as visited
                S.push(neighbor)

我可以看到我可以通过“奥斯汀”作为我的开始。但是我到底如何将“奥斯汀”设置为已访问,以及如何查看与“奥斯汀”相邻的节点?

另外,如果图是强连接的,我什至如何使用这个算法来返回真或假?

我很难看到这种从伪代码到代码的转移。感谢任何帮助。

【问题讨论】:

  • 您的数据结构不适合实现一般图,因为它不允许从一个顶点有多个边。 dict 值应该是目的地的列表

标签: python algorithm search graph depth-first-search


【解决方案1】:

我可以看到我可以通过“奥斯汀”作为我的开始。但是世界上怎么 我是否将“奥斯汀”设置为已访问,以及如何查看哪些节点是相邻的 到“奥斯汀”?

您可以在代码中看到弹出“Austin”,因此我们不会回头查看它。在您的数据结构中,您只允许来自一个顶点的一条边,因此您永远不会有多个邻居。

另外,如果图是强连接的,我怎么能使用这个算法来返回真或假?

这只是一个实用的 DFS 函数,用于查找图是否强连接的算法,需要运行两次 DFS。基本上,提示是您想知道在运行 DFS 时获得的是树还是森林。

在我看来,您应该更新您的数据结构,使每个键的值都是一个列表(它具有边缘的顶点)。您也可以将权重存储在列表中,以备日后使用。

【讨论】:

    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 2011-01-09
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多