我检查两个顶点之间的无向图中是否存在路径。在这里,我使用邻接列表制作无向图。我正在以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)
之后发生了错误,但我无法纠正错误
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
问题是
4 4
1 2
3 2
4 3
. .
您说顶点数为4
然后adj = new list<int>[V];
因此adj[0]
到adj[v-1]
是有效的。
然后,您尝试创建从4
到3
的边缘,并尝试访问adj[4]
中超出范围的addEdge()
。
分配V+1
lists
或从顶点编号添加边减1时。
答案 1 :(得分:0)
我的输入格式: - 顶点的数量,而不是
中的边数一行。边缘顶点在下一个边线数。最后
在两个顶点之间排列或不存在路径。
您的输入节点的范围是0
到V - 1
吗?如果您的输入节点范围为[1... V]
,那么它将导致数组超出绑定异常。要快速检查,请尝试初始化adj
和visited
数组的大小V + 100
并检查它的工作方式。