Я пытаюсь реализовать Алгоритм Форда Фулкерсона в C++.Найдите преимущество с использованием алгоритма Форда Фулкерсона?
Однако у меня возникли проблемы с моей функцией find_edge
. Когда я вызываю эту функцию в my_alg
, она выбирает правильный край, а затем поток увеличивается в my_alg
. Он выбирает правый край и увеличивает свой поток (flow
), но когда я снова вызываю функцию find_edge
, поток не увеличивается, как и должно быть.
Это приводит к бесконечному циклу моего алгоритма. Вероятно, я делаю что-то не так с указателями. Вы можете увидеть мой код ниже.
//An object of this class represents an edge in the graph.
class Edge
{
private:
//Node *prev;
public:
int flow;
Edge(Node *firstNode, Node *secNode, unsigned inCost) {
orgNode = firstNode;
dstNode = secNode;
bridge_capacity = inCost;
}
Edge() {
flow=0;
}
};
//An object of this class holds a vertex of the graph
class Node
{
public:
Node *prev;
vector<Edge>& getAdjNodeList() {
return adjNodeList;
}
};
Edge *find_edge(Graph *g,Node *from,Node *to) {
vector<Edge> b=from->getAdjNodeList();
for(int i=0;i<b.size();i++) {
if(b[i].getDstNode()==to)
return (&b[i]);
}
return NULL;
}
int my_alg(Graph *as,Node *source,Node *sink){
Edge *find_edge();
int max_flow=0;
while(bfs(as,source,sink)) {
Node *b=as->nodeList[num_isl];
int inc=100000000;
while(b->prev!=NULL) {
Edge *bok=find_edge(as,b->prev,b);
inc=min(inc,bok->get_bridge_capacity()-bok->flow);
b=b->prev;
}
b=as->nodeList[num_isl];
while(b->prev!=NULL){
Edge *bok = find_edge(as,b->prev,b);
bok->flow += inc; // This is the place the flow is incremented
bout << bok->flow; // Here, everything is alright.
bok = find_edge(as,b->prev,b);
cout << bok->flow; // However, this is is not the correct result.
}
max_flow+=inc;
}
return max_flow;
}
в начале my_alg, почему вы делаете «Edge * find_edge();» ? – ClickerMonkey
Если это какая-то помощь, я получаю эту ошибку: ошибка C2660: «find_edge»: функция не принимает 3 параметра, но она определяется как: Edge * find_edge (Graph * g, Node * from, Node * to), три params –
На самом деле я забыл удалить * find_edge() в my_alg.i добавил эту строку, когда я пытаюсь решить проблему. Но это ничего не меняет – sekogs