来源:
问题:
给出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]]
任何有关如何修复我的代码的建议,将不胜感激。
答案 0 :(得分:1)
我的猜测是,对于您提供的输入,您的edges
向量中只有四个元素,因为顶点4没有出线边。您的dfs
函数最终会递归到i == 4,但是您的edges
向量只有4个元素,因此最后一个有效位置是edges[3]
。
我建议您用空向量表示没有出顶点的顶点。
此外,if语句的第二部分
if(v[i] || i > edges.size())
return;
似乎毫不客气,也许应该只是
if(v[i])
return;