Python 表示要存储在文本文件中的图形的最佳方式

Python 表示要存储在文本文件中的图形的最佳方式,python,python-2.7,graph-theory,Python,Python 2.7,Graph Theory,我的问题涉及到创建一个有向图,通过与包含图的文本文件进行比较来检查它是否唯一,以及它是否唯一,并将其附加到文件中。在这种情况下,图形的最佳表示形式是什么? 我正在使用Python,我将使用蛮力检查图是否同构,因为图很小并且有一些限制 假设这是一个如何表示图形的简单案例,您可以使用简单的CSV格式,其中一条线是一条边,图形之间有一些分隔符,例如: graph_4345345 A,B B,C C,E E,B graph_3234766 F,D B,C 等等 然后可以使用我想这取决于如何将图形表示为

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

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

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


然后可以使用

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

作为数据结构,最为人所知的两种图形表示法是:

  • 邻接矩阵
  • 邻接表
  • 邻接矩阵

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

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


    邻接列表

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

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

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

    在无向图中,当且仅当i在j的邻接列表中时,顶点j在顶点i的邻接列表中。如果对图形进行加权,则每个邻接列表中的每个项都是一个两项数组或一个对象,给出顶点数和边权重


    导出到文件

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


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

    有一种标准的基于文本的格式,名为,这将使您能够使用各种不同的库来处理图形。值得注意的是,它允许您读取和写入点文件,以及使用matplotlib以图形方式打印它们。

    邻接列表

    以以下格式存储图形:

    第一行包含两个整数:
    N
    (节点数)和
    E
    (边数)。 然后,
    E
    行紧跟其后,每行包含两个整数
    U
    V
    。每行代表一条边(从
    U
    V

    这是四个节点的循环图的外观:

    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)
    
    另见