虽然以BFS顺序遍历图形,但在C ++中会出现Segmentation fault(core dumped)

时间:2017-10-17 08:34:16

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

检查两个顶点之间的无向图中是否存在路径。在这里,我使用邻接列表制作无向图。我正在以BFS顺序从源顶点遍历到目标顶点,以检查路径是否存在,并且还保持访问哪些顶点。

#include <iostream>
#include <list>
using namespace std;

// This class represents a undirected graph using adjacency list 
// representation
class Graph
{
    int V;    // No. of vertices
    list<int> *adj;    // Pointer to an array containing adjacency lists
public:
    Graph(int V);  // Constructor
    void addEdge(int v, int w); // function to add an edge to graph
    bool isReachable(int s, int d);  
};

Graph::Graph(int V)
{
    this->V = V;
    adj = new list<int>[V];
}

void Graph::addEdge(int v, int w)
{
    adj[v].push_back(w); // Add w to v’s list.
}

// A BFS based function to check whether d is reachable from s.
bool Graph::isReachable(int s, int d)
{
    // Base case
    if (s == d)
      return true;

    // Mark all the vertices as not visited
    bool *visited = new bool[V];
    for (int i = 0; i < V; i++)
        visited[i] = false;

    // Create a queue for BFS
    list<int> queue;

    // Mark the current node as visited and enqueue it
    visited[s] = true;
    queue.push_back(s);

    // it will be used to get all adjacent vertices of a vertex
    list<int>::iterator i;

    while (!queue.empty())
    {
        // Dequeue a vertex from queue and print it
        s = queue.front();
        queue.pop_front();

        // Get all adjacent vertices of the dequeued vertex s
        // If a adjacent has not been visited, then mark it visited
        // and enqueue it
        for (i = adj[s].begin(); i != adj[s].end(); ++i)
        {
            // If this adjacent node is the destination node, then 
            // return true
            if (*i == d)
                return true;

            // Else, continue to do BFS
            if (!visited[*i])
            {
                visited[*i] = true;
                queue.push_back(*i);
            }
        }
    }

    // If BFS is complete without visiting d
    return false;
}

// Driver program to test methods of graph class
int main()
{
    // Create a graph given in the above diagram
    int x,y,a,b;
    cin>>x>>y;
    Graph g(x);
    while(y--){
        cin>>a>>b;
        g.addEdge(a, b);
        g.addEdge(b, a);
    }
    int u, v;
    cin>>u>>v;
    if(g.isReachable(u, v))
        cout<<1<<endl;
    else
        cout<<0<<endl;

}  

以下输入时出现Segmentation fault (core dumped)错误: -

4 4
1 2
3 2
4 3
1 4
1 4  

我的输入格式: -
顶点的数量,而不是一行中的边数 边缘顶点在下一个边线数。
在最后一行中,存在或不存在路径的两个顶点。

上述输入的预期输出为1

我认为for (i = adj[s].begin(); i != adj[s].end(); ++i)之后发生了错误,但我无法纠正错误 有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

问题是

4 4
1 2
3 2
4 3
. .

您说顶点数为4然后adj = new list<int>[V]; 因此adj[0]adj[v-1]是有效的。 然后,您尝试创建从43的边缘,并尝试访问adj[4]中超出范围的addEdge()

分配V+1 lists或从顶点编号添加边减1时。

答案 1 :(得分:0)

  

我的输入格式: - 顶点的数量,而不是

中的边数      

一行。边缘顶点在下一个边线数。最后

     

在两个顶点之间排列或不存在路径。

可能的原因

您的输入节点的范围是0V - 1吗?如果您的输入节点范围为[1... V],那么它将导致数组超出绑定异常。要快速检查,请尝试初始化adjvisited数组的大小V + 100并检查它的工作方式。