我有两个班级MaxFlow
和MinMaxFlow
。
MaxFlow
使用boost图表从网络拓扑创建图表:
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_
,因为我们只需要一个实例来完成所有工作。
如果我们将MinMaxFlow
(设置容量设置为0)失败,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
时,调用{ {1}}将使用自己的数据,这会导致结果无法预测。
所以我的问题是:如果方法在maxFlowObj.maxFlowAlgo()
中使用局部变量,我如何在第二个类maxFlowAlgo
中使用该方法(如MaxFlow
)属于MinMaxFlow
?
更新:我发现问题来自MaxFlow
,我使用bundle属性并将容量属性映射传递给它,但是这个算法不仅会修改容量属性映射,还会修改我原来的边缘容量变量!现在解决方法是我必须在运行算法之前存储容量值并在之后恢复它们。它不应该修改原始成员,对吧?
答案 0 :(得分:1)
在这种情况下,可以改变边缘容量。
有时算法不会修改输入数据。另一方面,最好更改现有数据以节省资源(内存),因为更改的数据可能有意义。在执行最大流算法后,边缘容量是剩余容量;换句话说,当图表被流饱和时,每个边缘剩余多少容量。边缘中的至少一个将具有零剩余容量;在第二次算法执行后,由于图形饱和,它将返回零。
如果要多次运行max flow算法,则必须保留初始图并在每次运行算法时复制它。每次在循环迭代开始时,您都必须重建图形或从保留图形中复制它。
由于您多次运行算法,因此您可能希望在不同的图上运行它。您可能希望复制图形并将边缘容量设置为零。
答案 1 :(得分:0)
好像你问过XY Problem。
如果您想maintains a local variable g_ since we only need one instance
,则应使用Singleton Design Pattern,而不是在需要时创建实例。