C ++函数,返回指向另一个函数的指针数组

时间:2016-11-12 13:14:52

标签: c++

我有一个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;
}

0 个答案:

没有答案