查找无向图中的连接组件数

时间:2019-11-02 06:09:38

标签: c++ graph

来源:

here

问题:

  

给出n个标记为0到n-1的节点以及一个无向边的列表(每个边是一对节点),编写一个函数以查找无向图中的连接组件数。

方法:

class Solution 
{
public:
    int countComponents(int n, vector<vector<int>>& edges) 
    {
        std::vector<bool> v(n, false);
        int count = 0;

        for(int i = 0; i < n; ++i)
        {
            if(!v[i])
            {
                dfs(edges, v, i);
                count++;
            }
        }
        return count;
    }

    void dfs(std::vector<std::vector<int>>& edges, std::vector<bool>& v, int i)
    {
        if(v[i] || i > edges.size())
            return;

        v[i] = true;
        for(int j = 0; j < edges[i].size(); ++j)
            dfs(edges, v, edges[i][j]);
    }
};

错误:

堆缓冲区溢出

我不明白为什么我的代码会导致测试用例的堆缓冲区溢出:

5
[[0,1],[1,2],[2,3],[3,4]]

任何有关如何修复我的代码的建议,将不胜感激。

1 个答案:

答案 0 :(得分:1)

我的猜测是,对于您提供的输入,您的edges向量中只有四个元素,因为顶点4没有出线边。您的dfs函数最终会递归到i == 4,但是您的edges向量只有4个元素,因此最后一个有效位置是edges[3]

我建议您用空向量表示没有出顶点的顶点。

此外,if语句的第二部分

if(v[i] || i > edges.size())
        return;

似乎毫不客气,也许应该只是

if(v[i])
        return;