我有一个BFS搜索功能,我在其中声明一个指向visited
的指针的数组struct Edge
。我想将该指针数组发送到另一个函数,以便访问struct成员。
问题是我无法访问visited[i]->cap
。
我知道数组visited
的范围是本地的。从我的理解,它不应该影响任何东西,因为我创建一个新的数组对象(在福特福克森函数的while循环中),应该“复制”结果?我似乎无法弄清楚如何解决它。任何命中,解释都会很棒。
更新
我已经更新了代码。我现在使用std::array<Edge*,20001> visited
。问题是由于某种原因我仍然得到空指针。谁能明白为什么?
BFS函数中的上述代码应该阻止它,并将我的路径返回到我开始的位置。我完全错了吗?
/* Edge structure. Includes reverseEdge*/
struct Edge
{
int u;
int v;
int cap;
int flow;
struct Edge* reverseEdge;
Edge(int u, int v, int cap)
{
this->u = u;
this->v = v;
this->cap = cap;
this->flow = 0;
}
};
int FordFulkerson(int s, int t, array<vector<Edge*>, 20001> &adjacencyList, array<Edge*, 20001> &visited)
{
int flow = 0;
int b = INT_MAX;
while (BFS(s, t, adjacencyList, visited))
{
if (visited[t] != nullptr)
{
for (int i = t; t != s; i = visited[i]->u)
{
b = min(b,(visited[i]->cap) - (visited[i]->flow));
}
for (int i = t; t != s; i = visited[i]->u)
{
visited[i]->flow += b;
visited[i]->reverseEdge->flow -= b;
}
flow += b;
}
else
{
return 0;
}
}
}
/* BFS that returns a pointer to an array of pointers to edge (two levels of indirection) */
bool BFS(int s, int t, array<vector<Edge*>, 20001> &adjacencyList, array<Edge*, 20001> &visited)
{
queue<int> Q;
Q.push(s);
int n = 0;
while (!Q.empty())
{
int currentNode = Q.front();
Q.pop();
for (Edge *e : adjacencyList[currentNode])
{
if (e == nullptr)
{
//DO NOTHING
}
else{
if (visited[e->v] == nullptr && (e->cap) > (e->flow))
{
visited[e->v] = e;
Q.push(e->v);
if (e->v == t)
{
//clear queue here!
clearQueue(Q);
return true;
}
}
}
}
}
//clear queue here!
clearQueue(Q);
return false;
}