【问题标题】:Best way to represent a graph to be stored in a text file [closed]表示要存储在文本文件中的图形的最佳方法[关闭]
【发布时间】:2017-08-24 22:06:46
【问题描述】:

我的问题涉及创建一个有向图,通过与包含图形的文本文件进行比较来检查它是否唯一,如果它是唯一的,则将其附加到文件中。在这种情况下,要使用的图形的最佳表示是什么? 我正在使用 Python,我将使用蛮力检查图是否同构,因为图很小并且有一些限制。

【问题讨论】:

标签: python python-2.7 graph-theory


【解决方案1】:

有一种名为DOT 的标准基于文本的格式,它允许您使用有向图和无向图,并且可以让您受益于使用各种不同的库来处理您的图。值得注意的是graphviz,它允许您读取和写入 DOT 文件,以及使用 matplotlib 以图形方式绘制它们。

【讨论】:

    【解决方案2】:

    假设这是如何表示图形的简单案例,您可能可以使用简单的 CSV 格式,其中一条线是一条边,图形之间有一些分隔符,例如:

    graph_4345345
    A,B
    B,C
    C,E
    E,B
    graph_3234766
    F,D
    B,C
    

    等等

    然后你可以使用https://docs.python.org/3/library/csv.html

    【讨论】:

      【解决方案3】:

      我想这取决于您将如何将图形表示为数据结构。

      作为数据结构的两种最著名的图形表示是:

      1. 邻接矩阵
      2. 邻接列表

      邻接矩阵

      对于具有|V| 顶点的图,邻接矩阵 是由 0 和 1 组成的 |V|X|V| 矩阵,其中行 i 和列 j 为 1 当且仅当边 (i,j) 在图中。如果要指示边权重,请将其放在行 ij 条目中,并保留一个特殊值(可能为 null)以指示不存在的边。 使用邻接矩阵,我们可以通过查找矩阵中的相应条目来找出在恒定时间内是否存在边。例如,如果邻接矩阵名为graph,那么我们可以通过查看graph[i][j]来查询边(i,j)是否在图中。

      对于无向图,邻接矩阵是对称的:行i,列j条目为1当且仅当行j,列i条目为1。对于有向图,邻接矩阵不必是对称的。


      邻接列表

      用邻接列表表示一个图,将邻接矩阵与边列表结合起来。对于每个顶点i,存储与其相邻的顶点数组。我们通常有一个数组 |V|邻接列表,每个顶点一个邻接列表。

      邻接列表中的顶点编号不需要以任何特定顺序出现,尽管按升序列出它们通常很方便。

      我们可以在恒定时间内得到每个顶点的邻接表,因为我们只需要索引一个数组。为了找出图中是否存在边(i,j),我们以常数时间进入i的邻接表,然后寻找j i 的邻接列表中。

      在无向图中,顶点j在顶点i的邻接表中当且仅当ij中 的邻接列表。如果图是加权的,那么每个邻接列表中的每个项目要么是一个包含两个项目的数组,要么是一个对象,给出顶点编号和边权重。


      导出到文件

      如何将数据结构导出到文本文件?好吧,这取决于您如何阅读文本文件并将其导入您决定使用的数据结构中。

      如果我这样做,我可能会尝试以最简单的方式转储它,以便以后知道如何读取并将其解析回数据结构。

      【讨论】:

        【解决方案4】:

        邻接表

        以这种格式存储图表:

        第一行包含两个整数:N(节点数)和E(边数)。 然后E 后面的每行包含两个整数UV。每条线代表一条边(边从UV

        四个节点的循环图如下所示:

        4 4
        1 2
        2 3
        3 4
        4 1
        

        要在 python 中表示图形,您可以使用列表列表。

        N, E = input()      # input will take two comma separated integers
        
        graph = [[] for x in range(N+1)] # initially no edge is inserted
        
        for x in range(E): #to read E edges
            u, v = input()
        
            # inserting edge u->v
            graph[u].append(v)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-13
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多