微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查图连通性的程序产生分段错误

如何解决检查图连通性的程序产生分段错误

我目前正在制作一个程序来检查图形是否完全连接。我的方法是使用深度优先搜索遍历算法,并确保每个节点都是连接的。但是,我现在一编译程序就会遇到分段错误。我已经尝试了所有方法,我一直无法找到问题所在。这是我当前的代码

#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;
}

任何建议或潜在的解决方案将不胜感激。感谢您花时间阅读这篇文章

解决方法

主要问题是您忘记设置向量的大小。这导致了分段错误。

但是您的代码还有其他几个问题:

  1. 检测连通性的逻辑不正确。实际上,在您的代码中,最后一个节点的连接仅决定了图的连通性。当您从 DFS 的这个节点开始时,最后一个节点始终处于连接状态。

  2. 此处 for (int i = 0; i < 3; i++) 使用 0 索引。您忘记了在其余代码中,您使用的是 1-indexing。最好的方法是在任何地方使用 0 索引。尽管如此,在下面的代码中,我保留了 1-indexing,以展示如何处理它,特别是关于数组的大小。

  3. 你应该避免在代码中使用像 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 举报,一经查实,本站将立刻删除。