Python中的邻接列表实现

时间:2016-09-09 20:46:31

标签: python adjacency-list

我是Python(以及计算机科学)的新手,所以请耐心等待。

我在Python中实现邻接列表时遇到了麻烦。我已经学会了如何通过字典实现它(我在这里学到了如何通过lol),但我需要知道如何只使用基本列表(列表列表)

这是我的代码:

with open("graph1.txt") as infile:
    vertices = []
    for line in infile:
        line = line.split()
        line = [int(i) for i in line]
        vertices.append(line)


adj = dict()

for edge in vertices:
    x, y = int(edge[0]), int(edge[1])
    if x not in adj: adj[x] = set()
    if y not in adj: adj[y] = set()
    adj[x].add(y)
    adj[y].add(x)
print(adj)

感谢任何帮助。 干杯

2 个答案:

答案 0 :(得分:0)

你仍然会考虑一组顶点,每个顶点都有一组相邻的顶点,但是你将把这些集合实现为列表而不是更复杂的set数据结构。您将需要一种快速索引到顶级集合的方法,唯一的方法是使用整数索引。因此,您希望为每个顶点分配一个(自然或任意)整数k,然后将该顶点的邻接集(实现为列表)放入顶级列表的插槽k中。提供对二级列表的有效索引并不重要,因为您通常会迭代它们而不是选择特定的列表,但由于Python有一个内置列表,恰好提供了有效的整数索引,为什么不使用它?

我同意评论称vertices变量不应该保留边缘。世界上的每个人,但你会感到困惑,后来你也会感到困惑。我建议你使用名称vertices作为我上面描述的顶级列表。然后,第二级列表可以将索引保存到顶级vertices。 (好吧,也许你也需要边缘对象 - 我不知道你使用的是什么 - 但纯粹主义者的邻接列表表示没有边缘对象的空间。)

答案 1 :(得分:0)

我不确定你是否得到它,但无论如何这里是我的邻接列表的python实现。我使用了列表清单。 Python 2 代码:

class graph(object):
    def __init__(self, n):
        self.n=n
        self.mat=[list() for i in range(n)]

    def insert(self, u, v, w):
        t=[v, w]
        self.mat[u].append(t)

    def printGraph(self):
        i=0
        for i in range(self.n):
            print i, self.mat[i]

    def deleteEdge(self, u, v):
        weight=0
        for x in self.mat[u]:
            if x[0]==v:
                weight=x[1]
                break
        self.mat[u].remove([v, weight])

g=graph(3) # 3 is the number of vertices
g.insert(0, 1, 10) # 10 is the weight of the edge
g.insert(0, 2, 12)
g.insert(1, 2, 9)

g.printGraph()
g.deleteEdge(0, 1)
g.printGraph()