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

时间:2017-08-24 13:43:45

标签: python python-2.7 graph-theory

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

假设这是一个表示图形表示方式的简单情况,您可以使用简单的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

答案 2 :(得分:0)

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

作为数据结构的两个最着名的图表表示是:

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

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

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

    邻接列表

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

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

    我们可以在恒定时间内到达每个顶点的邻接列表,因为我们只需索引到一个数组。要确定图中是否存在边(i,j),我们会在恒定时间内转到 i 的邻接列表,然后查找< em> j 在 i 的邻接列表中。

    在无向图中,顶点 j 位于顶点 i 的邻接列表中,当且仅当 i 位于< em> j 的邻接列表。如果图是加权的,那么每个邻接列表中的每个项都是一个两项数组或一个对象,给出顶点数和边权重。

    导出到文件

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

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

答案 3 :(得分:0)

邻接清单

以这种格式存储图表:

第一行包含两个整数: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)