implementazione del grafico in PYthon

1

Ho trovato la seguente implementazione di un algoritmo Flow in Python:

class Edge(object):
    def __init__(self, u, v, w):
        self.source = u
        self.sink = v  
        self.capacity = w
    def __repr__(self):
        return "%s->%s:%s" % (self.source, self.sink, self.capacity)

lass FlowNetwork(object):
    def __init__(self):
        self.adj = {}
        self.flow = {}

    def add_vertex(self, vertex):
        self.adj[vertex] = []

    def get_edges(self, v):
        return self.adj[v]

    def add_edge(self, u, v, w=0):
        if u == v:
            raise ValueError("u == v")
        edge = Edge(u,v,w)
        redge = Edge(v,u,0)
        edge.redge = redge
        redge.redge = edge
        self.adj[u].append(edge)
        self.adj[v].append(redge)
        self.flow[edge] = 0
        self.flow[redge] = 0

Che è testato con:

>>> g = FlowNetwork()
>>> for v in "sopqrt":
>>>   g.add_vertex(v)
>>> g.add_edge('s','o',3)
>>> g.add_edge('s','p',3)

Mi stavo chiedendo cosa esattamente questa parte:

        edge.redge = redge
        redge.redge = edge

fa nella funzione add_edge; è come una sorta di chiamata "ricorsiva" in cui un vantaggio riceve il valore di redge in uno dei suoi attributi, ma perché l'ultima riga di

redge.redge = bordo?

Sta mettendo il bordo nell'attributo redge di redge?

Per quello che so di altri linguaggi OOP, quando si mette un punto tra due elementi esso indica principalmente una relazione oggetto.attributo, ma non vedo come ciò sia realizzato in quella sezione.

Grazie

    
posta asgard 04.11.2014 - 22:30
fonte

1 risposta

5

"redge" è il rovescio. Ogni lato memorizza il contrario di se stesso. Leggi le seguenti dichiarazioni di codice come il seguente paragrafo.

edge = Edge(u,v,w)

Crea lo spigolo in questione con il peso "w".

redge = Edge(v,u,0)

Crea il retro del bordo in questione con il peso "0".

edge.redge = redge

Il lato posteriore di "edge" diventa "redge".

redge.redge = edge

Il bordo posteriore del lato posteriore è il bordo in questione.

Con i pesi, hai una "capacità" di zero sul lato opposto. Pertanto, come programmatore, puoi seguire il grafico sul lato opposto, ma la simulazione avrà "nessuna capacità" in quella direzione nella tua simulazione.

E sì, la semantica è object.attribute in questo caso.

    
risposta data 05.11.2014 - 03:34
fonte

Leggi altre domande sui tag