在C ++中使用BFS获取2个顶点之间的路径

时间:2018-07-19 07:05:14

标签: c++ algorithm graph-theory graph-algorithm breadth-first-search

我为此编写了代码,但它给出了断开连接图的分段错误。对于连接的图形,它工作正常。 我该如何克服这个错误?

vector<int> getPathBFS(int V, int** edges,int v1, int v2, int* visited, unordered_map<int,int> t)
{
    queue<int> q;
    q.push(v1);
    visited[v1]=1;
    int done=0;
    while(!q.empty() && done==0)
    {
        for(int i=0;i<V;i++)
        {
            int front=q.front();
            q.pop();
            if(edges[front][i]==1 && visited[i]!=1)
            {
                q.push(i);
                t[i]=front;
                visited[i]=1;
                if(i==v2)
                {
                    done=1;
                    break;
                }
            }
        }
    }
    vector<int> a;
    if(done==0)
        return a;
    else
    {
        int k=v2;
        a.push_back(v2);
        while(k!=v1)
        {
            k=t[k];
            a.push_back(k);
        }
        return a;
    }
}

int main()
{
    int V, E;
    cin >> V >> E;   
    int** edges=new int*[V];
    for(int i=0;i<V;i++)
    {
        edges[i]=new int[V];
        for(int j=0;j<V;j++)
        {
            edges[i][j]=0;
        }
    }

    for(int i=0;i<E;i++)
    {
        int f,s;
        cin>>f>>s;
        edges[f][s]=1;
        edges[s][f]=1;
    }
    int v1,v2;
    cin>>v1>>v2;

    int* visited=new int[V];
    for(int i=0;i<V;i++)
        visited[i]=0;
    unordered_map<int,int> t;
    t[v2]=0;
    vector<int> ans=getPathBFS(V,edges,v1,v2,visited,t);
    for(int i=0;i<ans.size();i++ && !ans.empty())
    {
        cout<<ans[i]<<" ";
    }

    delete [] visited;
    for(int i=0;i<V;i++)
    {
        delete [] edges[i];
    }

    delete [] edges;

    return 0;
}

我做了一段代码。它将首先创建邻接矩阵边并标记其中的所有边。 Visited array用于跟踪到目前为止已访问过的所有顶点,因此没有无限循环。 对于下面给出的测试用例,它将一直工作到队列包含1,然后弹出1,并且循环将结束,因为没有剩余的边连接到1且未被访问。在此之后,while循环在理想情况下应该中断,并且当完成== 0时,它应该返回一个空向量。我不明白为什么会出现细分错误。

该地图用于跟踪哪个顶点由哪个顶点放入队列。

不适用于测试用例:

6 3
5 3
0 1
3 4
0 3

以下是上述测试案例的图形图像: enter image description here

在这里,我们需要找到从顶点0到3的路径。 输入格式为: 图中的顶点数,边数

顶点之间的边缘(对于E线),

我们需要找到路径的顶点。

1 个答案:

答案 0 :(得分:0)

您错误地弹出了BFS队列。您应该在外部循环中弹出队列,而不是对队列中的每个条目执行|V|次的内部for循环,而对每个队列中的每个元素都执行一次。

vector<int> getPathBFS(int V, int** edges,int v1, int v2, int* visited, unordered_map<int,int> t)
{
    queue<int> q;
    q.push(v1);
    visited[v1]=1;
    int done=0;
    while(!q.empty() && done==0)
    {
        int front=q.front();
        q.pop();

        for(int i=0;i<V;i++)
        {
            if(edges[front][i]==1 && visited[i]!=1)
            {
                q.push(i);
                t[i]=front;
                visited[i]=1;
                if(i==v2)
                {
                    done=1;
                    break;
                }
            }
        }
    }
    vector<int> a;
    if(done==0)
        return a;
    else
    {
        int k=v2;
        a.push_back(v2);
        while(k!=v1)
        {
            k=t[k];
            a.push_back(k);
        }
        return a;
    }
}

此外,在代码的main函数中,在for循环中还有一个多余的表达式!ans.empty(),您可以在其中打印答案。