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; } }; } };
复制代码

 

posted @   鸭子船长  阅读(521)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2019-04-24 Libreoffice 各类文件转换的filtername
点击右上角即可分享
微信分享提示