我有两个班级MaxFlow
和MinMaxFlow
.
MaxFlow
使用 boost graph 从网络拓扑创建图:
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_
,因为我们只需要一个实例来完成这里的所有工作。
如果我们失败了(将容量设置为 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
基于g_
类中的局部变量MaxFlow
,当我在中创建新对象maxFlowObj
时MinMaxFlow
,调用maxFlowObj.maxFlowAlgo()
将使用它自己的数据,这使得结果不可预测。所以我的问题是:如果方法在中使用局部变量,我如何使用maxFlowAlgo
属于MaxFlow
第二类的方法(如) ?MinMaxFlow
MaxFlow
更新:我发现问题出在boost::boykov_kolmogorov_max_flow
,我使用捆绑属性并将容量属性映射传递给它,但是这个算法不仅会修改容量属性映射,还会修改我原来的边缘容量变量!现在的解决方法是我必须在运行算法之前存储容量值并在它之后恢复它们。应该不会修改原来的成员吧?