Ich versuche, einen ungerichteten Graphen aus einer Adjazenzliste zu machen, um den Karger's Min Cut Algorithmus zu üben. Hier finden Sie meinen CodeMachen Sie ungerichteten Graphen aus der Adjazenzliste
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)
die Adjazenzliste Angenommen ist wie mit den Eckpunkten durch ganze Zahlen dargestellt folgt
1 -> 2,3,4
2 -> 1,3
3 -> 1,2,4
4 -> 1,3
Insgesamt wird dieser Graph fünf Kanten haben, so dass die Länge der Liste geführt Indizes Kanten Ein Scheitelpunkt ist mit nicht mehr als 5 Länge verbunden.
Zum Beispiel erwarte ich, dass der Eckpunkt '2' Indizes von nur zwei Kanten hat, d. H. Kanten mit den Eckpunkten 1 und 3. Stattdessen bekomme ich [0, 1, 2, 3, 0, 2, 1, 3]
. Ich brauche Hilfe, um herauszufinden, was schief läuft.
Ich bin die Ecken und Kanten als Arrays in dem Graphen-Objekt zu speichern, und dann über diese beiden Arrays referenziert. Ist es möglich, das Gleiche mit Diktaten zu tun, da sie mit Schlüsseln aufgerufen werden, die Einträge in einem Diktat möglicherweise nicht in der Reihenfolge, wie wir sie eingegeben hatten. – dpk
Nun, der Punkt für dict war wirklich, das Laden des Graphen zu beschleunigen und den Code zu vereinfachen. Dict und Schlüssel würden nützlich sein, wenn Sie nicht zusammenhängende Beschriftungen für Ihre Scheitelpunkte haben und ein Mapping speichern müssen. –
Wenn Sie planen, mit Ihrem Graphen viel zu berechnen, sollten die Arrays Ihnen einen schnelleren Zugriff ermöglichen und am Ende besser sein.Wenn Ihre Scheitelpunkte von 1 bis n wie in der Datei beschriftet sind, würde ich ein Array mit (n + 1) Scheitelpunkten in sortierter Reihenfolge füllen und dann Kanten hinzufügen. Oder beschriften Sie die Scheitelpunkte von 0 bis (n-1). Wenn Sie den Index und nicht das tatsächliche Objekt verwenden, benötigt das Erstellen von Kanten nicht die tatsächlichen Scheitelpunkte, sondern nur den Index, der von seiner Beschriftung abgezogen wird. –