求无向图中连通分量的个数

Finding the number of connected components in an undirected graph

本文关键字:分量      更新时间:2023-10-16

来源:

此处

问题:

给定从0到n-1的n个节点和一个无向边列表(每条边是一对节点(,编写一个函数来查找无向图中连接组件的数量。

方法:

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]]

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

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

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

此外,if语句的第二部分

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

似乎不合格,可能只是

if(v[i])
return;