と の 2 つのクラスがMaxFlow
ありMinMaxFlow
ます。
MaxFlow
ブースト グラフを使用して、ネットワーク トポロジからグラフを作成します。
class MaxFlow {
public:
MaxFlow : g_() { createGraph(); } //constructor
void createGraph();
void modifyGraph(); // modify the graph to use boost maxflow algorithm
int maxFlowAlgo(); // use g_ and some other util local variables
private:
Graph g_;
... // some other helper containers created during createGraph()
}
MaxFlow
g_
ここですべての作業を行うために必要なインスタンスは 1 つだけなので
、ローカル変数を維持します。失敗した場合(容量を 0 に設定) MinMaxFlow
、最小最大フローを見つけるためにグラフのすべてのエッジを繰り返します。edge
class MinMaxFlow {
public:
int getMinMaxFlow() {
int minMaxFlow = INT_MAX;
MaxFlow maxFlowObj; // create a new obj
maxFlowObj.modifyGraph(); // I suppose this modify current obj
for (auto edge : graph_edges) {
// maxFlowAlgo will return incorrect value after several runs
int maxFlowVal = maxFlowObj.maxFlowAlgo();
int minMaxFlow = std::min(minMaxFlow, maxFlowVal);
}
return minMaxFlow;
}
}
問題は、クラスmaxFlowAlgo
のローカル変数に基づいていることです。 で新しいオブジェクトを作成すると、呼び出しで独自のデータが使用されるため、結果が予測できなくなります。だから私の質問は:メソッドがでローカル変数を使用する場合、2番目のクラスに属するメソッド(のような)をどのように使用できますか?g_
MaxFlow
maxFlowObj
MinMaxFlow
maxFlowObj.maxFlowAlgo()
maxFlowAlgo
MaxFlow
MinMaxFlow
MaxFlow
更新: 問題が からのものであることがわかりました。boost::boykov_kolmogorov_max_flow
バンドル プロパティを使用して容量プロパティ マップをそれに渡しますが、このアルゴリズムは容量プロパティ マップだけでなく、元のエッジ容量変数も変更します! ここでの回避策は、アルゴリズムを実行する前に容量値を保存し、その後に復元する必要があることです。元のメンバーを変更することは想定されていませんよね?