Ich versuche, die Boost.Graph-Bibliothek zu verwenden, um Goldbergs Max-Flow-Algorithmus auszuführen. Boost.Graph nennt es push_relabel_max_flow.Hinzufügen von Kanten zu einem Graphen in Boost.Graph
Allerdings habe ich eine sehr schwere Zeit, die Bibliothek und ihr Typ-System zu verstehen. Die Dokumentation, die ich oben verlinkt habe, gibt einen Beispielcode. Aber in diesem Beispiel wird der Graph aus einer Datei gelesen. Ich möchte den Graph zur Laufzeit erzeugen. Dies ist der Code, den ich bisher (vor allem aus dem Beispiel kopiert):
typedef boost::adjacency_list_traits<boost::vecS, boost::vecS, boost::directedS> Traits;
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
boost::property<boost::vertex_name_t, std::string>,
boost::property<boost::edge_capacity_t, long,
boost::property<boost::edge_residual_capacity_t, long,
boost::property<boost::edge_reverse_t, Traits::edge_descriptor>>>> DirectedGraph;
DirectedGraph g;
Traits::vertex_descriptor s, t;
s = boost::add_vertex(g);
t = boost::add_vertex(g);
boost::add_vertex(g);
boost::add_vertex(g);
Nachdem ich hinzugefügt 4 Eckpunkte der grafischen Darstellung sollte ich „connect“ sie, das heißt Kanten mit einer Kapazität, Restkapazität zu machen und die umgekehrter Wert. Die Funktion für diese Aufgabe ist boost::add_edge()
, aber ich habe keine Ahnung, wie ich meine Argumente weitergeben kann. Der Beispielcode zeigt es nicht, denn wie gesagt, die Daten werden aus einer Datei gelesen und dann direkt zu einem Graphen geparst. Vielleicht kann jemand mit Erfahrung in der Boost.Graph-Bibliothek mir zeigen, wie.
Danke für Ihre Antwort! Eine letzte Frage: Was ist mit 'boost :: property'? Muss ich dafür keinen Wert angeben? –
Bobface
@Bobface: Ich habe es nicht initialisiert. Für die erste hinzugefügte Kante gibt es keine Umkehrkante, die dort platziert werden kann! Sie können später zurückgehen und es hinzufügen; Wenn "e" eine Kante ist und "er" seine umgekehrte Kante ist, wird 'g [e] .reverse = er' mit gebündelten Eigenschaften den Trick machen. – Kundor
Könnten Sie mir vielleicht ein kurzes Beispiel geben, wie ich eine Kante mit 'add_edge' hinzufügen und die Werte (Kapazität, Restkapazität, ..) im Aufruf direkt einstellen kann, wenn ich gebündelte Eigenschaften verwende? – Bobface