
求连通分量(DFS)(BFS)(STL)
输入处理:读取顶点数 初始化:创建一个标记数组 深度优先搜索(DFS):对于每个未被访问的顶点,执行DFS,标记所有可达的顶点,计数连通分量。 输出结果:打印连通分量的数量。 邻接矩阵初始化:读取边信息填充邻接矩阵 DFS函数:递归函数 主函数:读取输入,初始化邻接矩阵和访问数组,遍历每个顶点,执行DFS,最后输出连通分量数量。
发布日期:2021-05-08 21:48:35
浏览次数:22
分类:精选文章
本文共 1251 字,大约阅读时间需要 4 分钟。
为了求解图的连通分量,我们可以使用深度优先搜索(DFS)方法。以下是实现步骤和代码:
方法思路
n
和边的信息,构建邻接矩阵。visited
记录顶点访问状态,和一个计数器 components
记录连通分量数量。代码实现
#include#include using namespace std;void dfs(int i, const vector >& adj, vector & visited, int n, int& components) { if (visited[i]) return; visited[i] = true; components++; for (int j = 0; j < n; ++j) { if (!visited[j] && adj[i][j] != 0) { dfs(j, adj, visited, n, components); } }}int main() { int n, x, y; cin >> n; vector > adj(n, vector (n, 0)); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cin >> x >> y; if (i == x && j == y) { adj[i][j] = 1; } if (i == y && j == x) { adj[i][j] = 1; } } } vector visited(n, false); int components = 0; for (int i = 0; i < n; ++i) { if (!visited[i]) { dfs(i, adj, visited, n, components); } } cout << components << endl; return 0;}
代码解释
adj
,表示图的邻接关系。dfs
标记当前顶点,递归访问所有邻接顶点,计数连通分量。通过这种方法,我们可以高效地计算图的连通分量数量。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月09日 23时19分54秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
poj 2492A Bug's Life(并查集)
2019-03-06
ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)
2019-03-06
java中自动装箱的问题
2019-03-06
zyUpload+struct2完成文件上传
2019-03-06
knockout+echarts实现图表展示
2019-03-06
js冲刺一下
2019-03-06
程序员的开发文档
2019-03-06
mybatis generator修改默认生成的sql模板
2019-03-06
Spring根据包名获取包路径下的所有类
2019-03-06