Leetcode 323 无向图中连通分量的数目 广度优先遍历
给定编号从 0 到 n-1 的 n 个节点和一个无向边列表(每条边都是一对节点),请编写一个函数来计算无向图中连通分量的数目。
示例 1:
输入: n = 5 和 edges = [[0, 1], [1, 2], [3, 4]]
0 3
| |
1 --- 2 4
输出: 2
示例 2:
输入: n = 5 和 edges = [[0, 1], [1, 2], [2, 3], [3, 4]]
0 4
| |
1 --- 2 --- 3
输出: 1
注意:
你可以假设在 edges 中不会出现重复的边。而且由于所以的边都是无向边,[0, 1] 与 [1, 0] 相同,所以它们不会同时在 edges 中出现。
思路:
题目是需要找出图中有几条联通的路径,因此需要先构建图,然后从每个顶点开始遍历路径,并且记录经过的顶点,知道走完所有顶点
首先需要对输入数组进行处理,由于 n 个结点的编号从 0 到 n - 1 ,因此可以使用「嵌套数组」表示邻接表,具体实现请见参考代码;
然后遍历每一个顶点,对每一个顶点执行一次广度优先遍历,注意:在遍历的过程中使用 visited 布尔数组记录已经遍历过的结点。
class Solution { public: int countComponents(int n, vector<vector<int>>& edges) {
// 第 1 步:构建图 vector<vector<int>> path(n);
// 无向图,所以需要添加双向引用 for(int i=0;i<edges.size();++i){ path[edges[i][0]].push_back(edges[i][1]); path[edges[i][1]].push_back(edges[i][0]); }
// 第 2 步:开始广度优先遍历 vector<int> visit(n,0); int res=0; for(int i=0;i<n;++i){ if(visit[i]) continue; bfs(i,n,visit,path); res++; } return res; } void bfs(int i,int n, vector<int>& visit,vector<vector<int>>& path){ queue<int> q; q.push(i); visit[i]=1; while(!q.empty()){ int i=q.front(); q.pop(); for(int j=0;j<path[i].size();++j){ if(visit[path[i][j]]) continue; q.push(path[i][j]);
// 特别注意:在加入队列以后一定要将该结点标记为访问,否则会出现结果重复入队的情况 visit[path[i][j]]=1; } }; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
分类:
leetcode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2019-04-24 Libreoffice 各类文件转换的filtername