我的 C++ 程序中的一些代码使程序崩溃。我正在实现 BFS 算法
Posted
技术标签:
【中文标题】我的 C++ 程序中的一些代码使程序崩溃。我正在实现 BFS 算法【英文标题】:Some code in my C++ program crashes the program. I am implementing BFS algorithm 【发布时间】:2020-04-18 13:34:47 【问题描述】:我正在实现 BFS 算法。我在 IDE 中编写了这段代码。SYSTEM: 视窗 10 开发 c++ bfs() 函数可能有错误。我发布所有代码只是因为参考。 我的 C++ 代码:
#include<bits/stdc++.h>
using namespace std;
class Graph
int v; // number of vertices
vector<int>*adj;
public:
/**
* Constructor to initialize the graph.
* @param v an integer: number of nodes in the graph
*/
Graph(int V)
this->v=V;
this->adj=new vector<int>[V];
/**
* This function add a new edge to the graph.
* @param u an integer: representing a node in the graph.
* @param v an integer: representing a node in the graph.
* @param biDir a bool: true denotes bidirectional edge, unidirectional otherwise.
*/
void addEdge(int u,int v,bool biDir=false)
adj[u].push_back(v);
if(biDir)
adj[v].push_back(u);
/**
* This function traverse the given graph using BFS traversal technique.
* @param src a node: function starts traversing from this node.
*/
void bfs(int src)
// create a array of boolean to keep track of visited nodes.
vector<bool>visited(this->v,false);
// visited[0]=true;
// make a queue and insert src into it
queue<int>q;
q.push(src); // insert src into queue
// mark first node as visited
visited[src]=true;
while(!q.empty())
int node=q.front();
// visit
cout<<node<<" ";
// remove this node from queue
q.pop();
// visit every node adjacent to node 'node'
// if that node not visited then visit and enque it.
for(int adjNode:adj[node])
if(!visited[adjNode])
visited[adjNode]=true;
q.push(adjNode);
void print()
// for every vertex
for(int i=1;i<this->v;i++)
// every connected edge from vertex
cout<<i<<"-> ";
for(int node:adj[i])
cout<<node<<" ";
cout<<endl;
;
int main()
Graph g(5+1);
g.addEdge(1,2);
g.addEdge(1,4);
g.addEdge(4,6);
g.addEdge(3,6);
g.addEdge(2,5);
g.addEdge(5,2);
g.addEdge(6,3);
g.addEdge(6,4);
g.print();
cout<<endl;cout<<endl;cout<<endl;cout<<endl;
g.bfs(1);
return 0;
虽然这个程序编译得很好。但是在运行时,只有 print() 函数会执行。函数 bfs() 不执行。 它产生以下 OUTPUT: 由 print() 函数生成。
1-> 2 4
2-> 5
3-> 6
4-> 6
5-> 2
当我在 bfs() 中更改此代码时
vector<bool>visited(this->v,false);
致此
bool visited[this->v];
for(int i=0;i<this->v;i++)
visited[i]=false;
此代码也不执行 bfs()。
【问题讨论】:
在我的情况下,当我重新安装编译器时,它对我有用。 -- 什么?我希望可以使用向下投票的 cmets。很可能,您的程序有未定义的行为,可能是由于未初始化的变量或越界访问。 @OP -- 请不要重新安装你的编译器。 @rahulkumar -- 你错了。仅仅因为程序编译正常,not 是否意味着它在逻辑上是正确的或没有错误。编译正常意味着程序没有语法错误。此外,bits
标头不是标准的——您应该包含正确的 C++ 标头。
我无法找到为什么我的程序会简单地终止(崩溃)的错误?您需要访问调试器。使用它来追踪崩溃发生的位置。
第二个调试器建议。如果您不知道如何使用调试器,请学习如何使用。不使用调试器就像开车没有镜子一样。我看到的一个具体问题是您创建了一个包含 6 个节点(有效索引 0 -> 5)的图,然后尝试访问索引为 6 的节点。不确定这是否是您唯一的问题,但这是第一个大问题。创建图表时使用“5 + 1”令人担忧。如果您想要 5 个节点,请输入 5。如果您想要 6 个节点,请输入 6。这让我觉得您正在尝试通过逐一显示和引入逐一错误来变得聪明。
是的,一个问题是您访问的向量越界。
【参考方案1】:
您只需将大小设置为 7 即可。您的问题是您正在调整图形的大小以具有 6 个节点,但访问第 7 个节点(编号为 6 的节点被认为是第 7 个节点,因为索引从 0 开始)。但无论如何,这不是解决问题的最佳方法。如果您希望包含数字 6,则让图形的大小为 V + 1
。我还注意到您正在使用指向图中向量的指针。我认为如果您使用向量向量代替会更好。这是一个解决问题的代码。
#include <iostream>
#include <vector>
#include <queue>
class Graph
std::vector<std::vector<int>> _graph;
public:
Graph(int size)
// nodes within the range [0..size] are valid.
_graph.resize(size + 1);
void addEdge(int from, int to, bool undirected = false)
_graph[from].push_back(to);
if (undirected)
_graph[to].push_back(from);
void bfs(int source)
std::vector<bool> visited(_graph.size(), false);
std::queue<int> queue;
queue.push(source);
int depth = 0;
while (!queue.empty())
int size = queue.size();
std::cout << "Depth Level " << depth << " (with " << size << " unvisited nodes): ";
while (size--)
int current = queue.front();
std::cout << current << ' ';
visited[current] = true;
queue.pop();
for (int node : _graph[current])
if (!visited[node])
queue.push(node);
std::cout << std::endl;
depth++;
;
int main()
Graph g(6);
g.addEdge(1, 2);
g.addEdge(1, 4);
g.addEdge(4, 6);
g.addEdge(3, 6);
g.addEdge(2, 5);
g.addEdge(5, 2);
g.addEdge(6, 3);
g.addEdge(6, 4);
g.bfs(1);
输出:
Depth Level 0 (with 1 unvisited nodes): 1
Depth Level 1 (with 2 unvisited nodes): 2 4
Depth Level 2 (with 2 unvisited nodes): 5 6
Depth Level 3 (with 1 unvisited nodes): 3
【讨论】:
对于将来遇到此问题的任何人-此答案是创可贴。不应该这样解决。班级内部的错误应该得到修复。此修复程序只会使界面混乱。 @JohnFilleau 你是对的。我正在更新答案。谢谢。【参考方案2】:如我所见,您正在使用基于1
的节点值索引。我的意思是您没有考虑将0
作为图表中的一个节点。图中的任何节点都从1
开始。在初始化图形时,您可以将图形大小的值设置为等于number of nodes + 1
.
我的意思是,
Graph(int V)
this->v=V+1;
this->adj=new vector<int>[V];
这可以解决您的问题。
【讨论】:
以上是关于我的 C++ 程序中的一些代码使程序崩溃。我正在实现 BFS 算法的主要内容,如果未能解决你的问题,请参考以下文章