求连通分量(DFS)(BFS)(STL)
发布日期:2021-05-08 21:48:35 浏览次数:22 分类:精选文章

本文共 1251 字,大约阅读时间需要 4 分钟。

为了求解图的连通分量,我们可以使用深度优先搜索(DFS)方法。以下是实现步骤和代码:

方法思路

  • 输入处理:读取顶点数 n 和边的信息,构建邻接矩阵。
  • 初始化:创建一个标记数组 visited 记录顶点访问状态,和一个计数器 components 记录连通分量数量。
  • 深度优先搜索(DFS):对于每个未被访问的顶点,执行DFS,标记所有可达的顶点,计数连通分量。
  • 输出结果:打印连通分量的数量。
  • 代码实现

    #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函数:递归函数 dfs 标记当前顶点,递归访问所有邻接顶点,计数连通分量。
  • 主函数:读取输入,初始化邻接矩阵和访问数组,遍历每个顶点,执行DFS,最后输出连通分量数量。
  • 通过这种方法,我们可以高效地计算图的连通分量数量。

    上一篇:连通图(STL)
    下一篇:电子眼(树形DP)

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月09日 23时19分54秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章