[LeetCode] Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数...

2023-05-16

 

Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to find the number of connected components in an undirected graph.

Example 1:

     0          3

     |          |

     1 --- 2    4

Given n = 5 and edges = [[0, 1], [1, 2], [3, 4]], return 2.

Example 2:

     0           4

     |           |

     1 --- 2 --- 3

Given n = 5 and edges = [[0, 1], [1, 2], [2, 3], [3, 4]], return 1.

 Note:

You can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together in edges.

 

这道题让我们求无向图中连通区域的个数,LeetCode中关于图Graph的题屈指可数,解法都有类似的特点,都是要先构建邻接链表Adjacency List来做。这道题的一种解法是利用DFS来做,思路是给每个节点都有个flag标记其是否被访问过,对于一个未访问过的节点,我们将结果自增1,因为这肯定是一个新的连通区域,然后我们通过邻接链表来遍历与其相邻的节点,并将他们都标记成已访问过,遍历完所有的连通节点后我们继续寻找下一个未访问过的节点,以此类推直至所有的节点都被访问过了,那么此时我们也就求出来了连通区域的个数。

 

解法一:


class Solution {
public:
    int countComponents(int n, vector<pair<int, int> >& edges) {
        int res = 0;
        vector<vector<int> > g(n);
        vector<bool> v(n, false);
        for (auto a : edges) {
            g[a.first].push_back(a.second);
            g[a.second].push_back(a.first);
        }
        for (int i = 0; i < n; ++i) {
            if (!v[i]) {
                ++res;
                dfs(g, v, i);
            }
        }
        return res;
    }
    void dfs(vector<vector<int> > &g, vector<bool> &v, int i) {
        if (v[i]) return;
        v[i] = true;
        for (int j = 0; j < g[i].size(); ++j) {
            dfs(g, v, g[i][j]);
        }
    }
};  

 

这道题还有一种比较巧妙的方法,不用建立邻接链表,也不用DFS,思路是建立一个root数组,下标和节点值相同,此时root[i]表示节点i属于group i,我们初始化了n个部分 (res = n),假设开始的时候每个节点都属于一个单独的区间,然后我们开始遍历所有的edge,对于一条边的两个点,他们起始时在root中的值不相同,这时候我们我们将结果减1,表示少了一个区间,然后更新其中一个节点的root值,使两个节点的root值相同,那么这样我们就能把连通区间的所有节点的root值都标记成相同的值,不同连通区间的root值不相同,这样也能找出连通区间的个数。

 

解法二:


class Solution {
public:
    int countComponents(int n, vector<pair<int, int> >& edges) {
        int res = n;
        vector<int> root(n);
        for (int i = 0; i < n; ++i) root[i] = i;
        for (auto a : edges) {
            int x = find(root, a.first), y = find(root, a.second);
            if (x != y) {
                --res;
                root[y] = x;
            }
        }
        return res;
    }
    int find(vector<int> &root, int i) {
        while (root[i] != i) i = root[i];
        return i;
    }
};  

 

类似题目:

Clone Graph

Minimum Height Trees 

Course Schedule

Course Schedule II

 

参考资料:

https://leetcode.com/discuss/77308/accepted-dfs-in-c

https://leetcode.com/discuss/77027/c-solution-using-union-find

https://leetcode.com/discuss/76519/similar-to-number-of-islands-ii-with-a-findroot-function

 

LeetCode All in One 题目讲解汇总(持续更新中...)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[LeetCode] Number of Connected Components in an Undirected Graph 无向图中的连通区域的个数... 的相关文章

  • 扬帆证券:如何辨别股票基本面的好坏?

    怎样区别股票根本面的好坏 教你轻松区别优劣股 1 市盈率 市盈率是指一个公司股票的价格相对于其每股收益的比率 是衡量一家公司是否被高估或轻视的重要方针之一 2 市净率 市净率指的是每股股价与每股净资产的比率 一般来说市净率较低的股票 出资价
  • 在浏览器中编译一个“.vue”组件,只用JS?

    我想将 vue 组件 包含 html js css 编译为 JS 但在浏览器端 没有 browserify vuify webpack 或其他 在一个更好的世界中 我想将我的 vue 组件包含到我的 html 应用程序中 就像这样 不需要在
  • 工具提示控件如何通过新属性增强表单上的所有控件?

    在回答另一个问题时 我开始想知道如何向表单中的所有控件添加新属性 就像工具提示控件那样 例如 我可以使用它将 IsDirty 标志添加到所有文本框 只需将组件添加到表单中 它就会为每个文本框处理这个问题 将工具提示控件添加到表单时 所有控件
  • 如何在 React 中重定向到外部链接?

    我正在构建一个画廊 您单击图像 它将使用 props 加载到单独的组件中 该图像是一个 URL 取自数组 其中 src 属性通过 CSS 作为背景图像加载 我的挑战是将 src 数据连接到子组件 查看原始问题 https stackover
  • 如何传递对 aframe 组件的引用?

    我正在编写一个自定义 aframe 组件来渲染基于很长的对象数组的网格 Aframe 文档仅将数组列为输入类型 您可以在其中传递属性 它将被解析为数组attributename 1 2 3 我想从外部将 JavaScript 引用传递到组件
  • ReactJs 全局辅助函数

    问题 我有很多小的辅助函数 它们不一定需要存在于组件中 或者也许它们可以 但它们会使该组件因大量代码而变得臃肿 我懒惰的一面只是想让这些全部都存在组件可以调用的某种全局函数 我真的很想编写好的 ReactJs 代码 问题 Reactjs 中
  • Delphi 中组件的定位提示

    使用 Delphi XE6 我正在创建一个类似 TdateTimePicker 的控件 但由于几个原因 我使用了 TButtonedEdit 其中 嵌入 了 TMonthCalendar 完整的简单演示是 我已经按照需要进行了 当单击右键时
  • PHP Yii:运行时数据库连接

    我想在运行时使用 Yii 连接到第二个数据库 数据库名称将来自用户登录后的数据库表 我在教程中看到我应该这样做 db2 Yii createComponent array class gt EMongoClient server gt mo
  • 如何在reactstrap Dropdown中设置所选项目?

    如何在reactstrap Dropdown中设置所选项目 有一个下拉示例 https reactstrap github io components dropdowns https reactstrap github io compone
  • 属性更改时重新构建/重新渲染 Angular2 组件

    如何实施 我的子组件 import Component Input ngOnInit from angular2 core Component selector my component template div In child comp
  • 如何在 NextJs 中共享两个项目中的组件?

    我不知道在我的特定情况下共享组件 ReactJs 的最佳选择是什么 我在 NextJs 中有两个应用程序 一个是电子商务 另一个是该电子商务的经理门户 在第一个应用程序 电子商务 中 我有 UI 组件 按钮 字段 标题 文本等 我想在其他项
  • AppComponent中的错误无法用作入口组件

    嘿 我是使用 Angular 和 Web 开发的新手 我已经浏览了一些教程 当尝试合并使用我的 Firebase 数据库时 在本地编译 使用 ng 服务 时 我的应用程序失败 返回 AppComponent不能用作入口组件 如果您能提供任何
  • 第三方代码正在修改 FPU 控制字

    简介 又长又无聊的部分 问题在最后 我对不断更改 FPU 控制字的第三方 COM 组件感到非常头疼 我的开发环境是Windows和Visual C 2008 正常的FPU控制字指定在各种情况下不应抛出异常 我已经通过查看验证了这一点 CW
  • ExtJS 4:单击按钮后替换视口项目数组中的两个组件

    下面是一些单击按钮后即可运行的代码 当我在另一个按钮中再次设置 视图 变量 对于不同的按钮 并使用不同的网格和不同的表单运行这个确切的代码时 这两个项目完全消失 为什么它在第一次迭代时运行 但在第二次迭代时不运行 更重要的是 我怎样才能正确
  • 意图启动新活动非常慢:(

    我有一段 Intent 代码 Intent i new Intent i setAction Intent ACTION MAIN i addCategory Intent CATEGORY LAUNCHER i setFlags Inte
  • 为我的组件位图属性赋值时发生访问冲突[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试创建一个必须使用位图的组件
  • 从静态 JSON 加载内容 Next JS

    我有一个 Next JS 项目 其静态 JSON 放置在 pages api data json 中 如下所示 Card title Title 1 content Content 1 title Title 2 content Conte
  • iFrame 中的 Angular2 不安全资源 URL 与 DomSanitationService

    背景 我正在为我们正在研究的过渡策略进行概念验证 该策略将在我们致力于将现有功能转换为 Angular 的同时将 旧 Web 应用程序引入 iFrame Issue 我遇到的问题是尝试在 iFrame 上设置 src 标记 我正在尝试使用
  • Cypress Vue 组件测试从已挂载发出的事件

    我有一个 vue2 组件 它在其安装的生命周期挂钩中发出一个事件 该事件被发出 并且可以由使用该组件的页面处理 但是 我还想测试该事件是否在我的组件测试中发出 该测试使用赛普拉斯组件测试运行程序 这是一个精简版本 组件 TheCompone
  • TColorProperty德尔福柏林10.1.2?

    我正在尝试将组件从 Delphi 7 转换为 Delphi Berlin 平面组件 https sourceforge net projects flatstyle https sourceforge net projects flatst

随机推荐