Я пытаюсь сделать неориентированный граф из списка смежности, чтобы применить алгоритм Min Cut от Karger. Ниже мой кодСделать неориентированный граф из списка смежности
class Vertex(object):
'''Represents a vertex, with the indices of edges
incident on it'''
def __init__(self,name,edgeIndices=[]):
self.name = name
self.edgeIndices = edgeIndices
def getName(self):
return self.name
def addEdge(self,ind):
self.edgeIndices.append(ind)
def getEdges(self):
return self.edgeIndices
def __eq__(self,other):
return self.name == other.name
class Edge(object):
'''Represents an edge with the indices of its endpoints'''
def __init__(self,ends):
self.ends = ends
def getEnds(self):
return self.ends
def __eq__(self,other):
return (self.ends == other.ends)\
or ((self.ends[1],self.ends[0]) == other.ends)
class Graph(object):
def __init__(self,vertices,edges):
self.edges = edges
self.vertices = vertices
def createGraph(filename):
'''Input: Adjacency list
Output: Graph object'''
vertices = []
edges = []
with open(filename) as f:
for line in f:
elements = line.split()
newVert = Vertex(elements[0])
if newVert not in vertices:
vertices.append(newVert)
for verts in elements[1:]:
otherVert = Vertex(verts)
if otherVert not in vertices:
vertices.append(otherVert)
end1 = vertices.index(newVert)
end2 = vertices.index(otherVert)
newEdge = Edge((end1,end2))
if newEdge not in edges:
edges.append(newEdge)
newVert.addEdge(edges.index(newEdge))
return Graph(vertices,edges)
Предположит, список смежности следующим образом с вершинами, представленных целых числами
1 -> 2,3,4
2 -> 1,3
3 -> 1,2,4
4 -> 1,3
В общей сложности, этот график будет иметь пять ребер, поэтому длина списка холдинговых индексы ребер вершина связана с длиной не более 5.
Например, я ожидаю, что вершина «2» будет иметь индексы только двух ребер, то есть ребер с вершинами 1 и 3. Вместо этого я получаю [0, 1, 2, 3, 0, 2, 1, 3]
. Мне нужна помощь, чтобы выяснить, что происходит.
Я хранения вершин и ребер, как массивы в объекте графа, а затем перекрестных ссылок эти два массива. Можно ли сделать то же самое с dicts, поскольку к ним обращаются с помощью ключей, более того, записи в dict могут быть не такими, как мы ввели. – dpk
Ну, точка для dict была действительно ускорить загрузку графика и упростить код. Dict и ключи пригодились бы, если у вас есть несмежные метки для ваших вершин и нужно сохранить некоторое сопоставление. –
Если вы планируете выполнять тяжелые вычисления с помощью своего графика, массивы должны дать вам быстрый доступ и быть лучше в конце.Если ваши вершины помечены от 1 до n, как в файле, я бы заполнил массив с (n + 1) вершинами в отсортированном порядке, а затем добавил ребра. Или пометьте вершины от 0 до (n-1). Поскольку вы используете индекс, а не фактический объект, для создания ребер не нужны фактические вершины, просто его индекс вычитается из его метки. –