zoukankan      html  css  js  c++  java
  • 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=
  • 相关阅读:
    Codeforces Round #261 (Div. 2) D
    数据类型总结之列表字典
    while +for+字符串
    20150304+JQuery+AJax+插件-02
    20150304+JQuery+AJax+插件-01
    20150303+JQuery选择器-02
    20150303+JQuery选择器-01
    20150302+JQuery-02
    20150302+JQuery-01
    20150228--Ajax2-02
  • 原文地址:https://www.cnblogs.com/zl1991/p/14697991.html
Copyright © 2011-2022 走看看