如何解决检查图连通性的程序产生分段错误
我目前正在制作一个程序来检查图形是否完全连接。我的方法是使用深度优先搜索遍历算法,并确保每个节点都是连接的。但是,我现在一编译程序就会遇到分段错误。我已经尝试了所有方法,我一直无法找到问题所在。这是我当前的代码:
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> adj;
vector<bool> visited;
void dfs(int v) {
visited[v] = true;
for (int u : adj[v]) {
if (!visited[u])
dfs(u);
}
}
int main() {
bool connected = false;
adj[1].push_back(2);
adj[2].push_back(3);
adj[3].push_back(1);
dfs(3);
for (int i = 0; i < 3; i++) {
if (visited[i]) {
connected = true;
}
else
connected = false;
}
if (connected) {
cout << "connected" << endl;
}
else
cout << "it isn't connected" << endl;
}
任何建议或潜在的解决方案将不胜感激。感谢您花时间阅读这篇文章!
解决方法
主要问题是您忘记设置向量的大小。这导致了分段错误。
但是您的代码还有其他几个问题:
-
检测连通性的逻辑不正确。实际上,在您的代码中,最后一个节点的连接仅决定了图的连通性。当您从 DFS 的这个节点开始时,最后一个节点始终处于连接状态。
-
此处
for (int i = 0; i < 3; i++)
使用 0 索引。您忘记了在其余代码中,您使用的是 1-indexing。最好的方法是在任何地方使用 0 索引。尽管如此,在下面的代码中,我保留了 1-indexing,以展示如何处理它,特别是关于数组的大小。 -
你应该避免在代码中使用像
3
这样的魔法常量。
#include <iostream>
#include <vector>
//using namespace std;
std::vector<std::vector<int>> adj;
std::vector<bool> visited;
void dfs(int v){
visited[v] = true;
for (int u : adj[v]) {
if (!visited[u])
dfs(u);
}
}
int main(){
int n_nodes = 3;
visited.resize(n_nodes+1); // <-- !!!
adj.resize(n_nodes+1); // <-- !!!
adj[1].push_back(2);
adj[2].push_back(3);
adj[3].push_back(1);
dfs(3);
bool connected = true;
for(int i = 1; i <= n_nodes; i++) { // 1-indexed
if(!visited[i]){
connected = false;
}
}
if(connected) {
std::cout << "connected" << std::endl;
} else {
std::cout << "it isn't connected" << std::endl;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。