【问题标题】:How to check whether a graph is an undirected graph?如何检查图是否为无向图?
【发布时间】:2020-07-02 15:59:42
【问题描述】:

目前,我正在创建一个函数来检查图形是否是无向的。 方式,我的图表是这样存储的。这是 3 个节点 1、2、3 的无向图。

graph = {1: {2:{...}, 3:{...}}, 2: {1:{...}, 3:{...}}, 3: {1:{...}, 2:{...}}}

{...} 表示每个节点中连接的字典的交替层。它是无限循环的,因为它是相互嵌套的。

关于图表的更多细节:

  1. 键是指节点,它的值是指字典,其中节点连接到键。
  2. 示例:具有无向边的两个节点 (1, 2):graph = {1: {2: {1: {...}}}, 2: {1: {2: {...}}}}
  3. 示例 2:两个节点 (1, 2) 的有向边从 1 到 2:graph = {1: {2: {}}, 2: {}}

我目前判断一个图是否无向的方法是检查图中的边数是否等于 (n*(n-1))/2(n 表示节点),但这不能区分 15 条有向边和 15 条无向边,那么我还有什么其他方法可以确认我的图是无向的?

【问题讨论】:

  • 你能提供一个样本字典吗?另外,是否允许使用自边缘?
  • @BalajiAmbresh 不,我忽略了自我边缘以使事情变得更容易,您能否详细说明示例字典的含义。
  • 您能否提供一个graph 的示例并解释键/值代表什么?
  • @BalajiAmbresh 我已经用关于我的图表的更多细节更新了这个问题,希望它足够了。
  • 一般来说,一个图是否有向是一个结构决定。也就是说,你实现任何东西或用代码表示图形之前就已经确定了。如果您需要检查图表的数据以了解它是否是有向的,那么“无向”可能意味着与正常情况不同的东西。您的定义是对于每条边 A->B,还有一条边 B->A 吗?因为只是这些不同事物的想法暗示了有向图。

标签: python python-3.x dictionary graph


【解决方案1】:

首先,我认为您通过调用具有两个方向的边的图“无向”来滥用术语。在真正的无向图中,没有边的方向概念,这通常意味着您不需要计算机程序中图形表示中的冗余方向信息。你所拥有的是一个有向图,你想看看它是否可以用一个无向图来表示,即使你还没有这样做。

我不确定是否有比检查图中的每条边以查看反向边是否也存在更简单的方法来做到这一点。这对于您的图形结构非常简单,只需遍历顶点并检查每个传出边是否有返回边:

def undirected_compatible(graph):
    for src, edges in graph.items():          # edges is dict of outgoing edges from src
        for dst, dst_edges in edges.items():  # dst_edges is dict of outgoing edges from dst
            if src not in dst_edges:
                return False
    return True

我注意到,描述像您这样的图形的更典型方法是省略嵌套字典,而只给出边缘的目的地列表。一个完全连接的 3 节点图将是:

{1: [2, 3], 2: [1, 3], 3: [1, 2]}

您可以从此图表中获得与当前图表相同的信息,您只需要一个额外的间接来查找顶级图表字典中的目标节点,而不是让它成为相应键的值边缘容器已经。对于这种更传统的结构,我上面的函数的一个版本是:

def undirected_compatible(graph):
    for src, edges in graph.items():
        for dst in edges:
            if src not in graph[dst]:
                return False
    return True

not in 测试可能会使大型图的速度变慢,因为在列表中搜索项目的渐近效率低于检查键是否在字典中。如果您需要更高的性能,您可以使用集合而不是列表来加快成员资格测试。

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多