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=