2016-04-13 21 views
1

我有两个类MaxFlowMinMaxFlow如何从另一个类调用函数,其中函数使用局部变量

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_因为我们只需要一个实例来这里做所有的工作。 MinMaxFlow遍历图中每个边找到一个最低的最高流量,如果我们不能在该edge(设置容量为0):

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; 
    } 
} 

现在的问题是,maxFlowAlgoMaxFlow类,当基于本地变量g_我在MinMaxFlow中创建新对象maxFlowObj,调用maxFlowObj.maxFlowAlgo()将使用自己的数据,这使得结果不可预知。 所以我的问题是:如果该方法使用MaxFlow中的局部变量,如何使用方法(如maxFlowAlgo)属于MaxFlow在第二类MinMaxFlow

更新:我已经弄清楚了问题是从boost::boykov_kolmogorov_max_flow,我用束属性和通过容量属性映射到它里面,但是这个算法不但修改容量属性映射,而且还是我原来的边缘容量变量!现在解决方法是,我必须在运行算法之前存储容量值并在其后恢复它们。它不应该修改原来的成员,对吧?

+0

'g_'不是一个局部变量,而是一个* member *变量。它们是有区别的。 – callyalater

+0

你可以让你的'g_'变量为静态的,以便你的类的所有实例“共享”它。这可能有所帮助:[静态成员](https://msdn.microsoft.com/en-us/library/79b3xss3.aspx#Anchor_0) –

+0

了解什么是局部变量,类成员和静态类成员。使''g_'简单''static'不会立即让你的代码正确。为什么'maxFlowAlgo'“在几次运行后返回不正确的值”?我想它应该是'const'。你不要在循环中使用'edge'变量。也许,这个边缘是打算在迭代开始时被删除,并在最后添加? –

回答

0

看来你问了一个XY Problem

如果你想maintains a local variable g_ since we only need one instance,你应该使用Singleton Design Pattern,而不是在需要时创建实例。

1

在这种情况下可以改变边缘容量。

有时算法不会修改输入数据。另一方面,最好更改现有的数据以节省资源(内存),因为更改后的数据是有意义的。在执行最大流量算法之后,边缘容量是剩余容量;换句话说,当图形被流动饱和时,每个边缘剩下多少容量。至少有一个边缘将具有零剩余容量;当第二个算法执行后,由于图形饱和,它将返回零。

如果您想运行最大流算法几次,您必须保存初始图形并在每次运行算法时将其复制。每次循环迭代开始时,您都必须重建您的图形或从保留的图形中复制它。

由于您多次运行算法,您可能希望在不同的图表上运行它。您可能想要复制图形并将边缘容量设置为零。

+0

是的。我通过构建一个默认基本图解决了这个问题。修改它,运行maxflow算法,恢复它,然后为每个边组重复这三个步骤。它现在运行完美。再次感谢您的见解。 –

相关问题