leetcode_547 省份数量

该题主要运用了图的连通性 接着使用染色法解决该问题

染色法:标记所有节点为false 访问后 将其标记位true

复制代码
class Solution {
    int n;            // 代表n个数据
    bool colors[201]; // 标记是否访问到

    void dfs(vector<vector<int>>& isConnected, int u) { // u代表从哪个点开始访问
        if (colors[u]) { // 递归终止条件:该节点已经被访问
            return;
        }
        colors[u] = true; // 标记位以访问

        for (int i = 0; i < n; ++i) {
            if (isConnected[u][i]) {
                dfs(isConnected, i);
            }
        }
    }

public:
    int findCircleNum(vector<vector<int>>& isConnected) {
        n = isConnected.size();
        memset(colors, false, sizeof(isConnected)); // 初始化全部为未访问
        int cnt = 0;
        for (int i = 0; i < isConnected.size(); ++i) {
            if (colors[i] == false) {  //只访问未访问过的节点
                dfs(isConnected, i);
                ++cnt;
            }
        }
        return cnt;
    }
};

在递归过程中 开始由于判断错了一个条件 导致不能通过全部案例

复制代码
for (int i = 0; i < n; ++i) {
            if (isConnected[u][i]) {
                dfs(isConnected, i);
            }
        }

写成了

复制代码
for (int i = u + 1; i < n; ++i) {
            if (isConnected[u][i]) {
                dfs(isConnected, i);
            }
        }

我想的是这个节点既然是连通的 那么必将是先访问数字小的节点 在访问数字大的节点 我这么写之后 错了 我以为是 数组越界的问题 但是这个i如果超出了数组的边界不会进去for循环内部 我又把 这一句改为 i = u 我觉得就是没有必要去继续访问比自己小的节点了 但是忽略了一个问题 就是小的节点可能直接和一个更大的节点相连 并没有和另一个小的相连 这样子的话 传入的起始节点就会很大 但是大的节点和另一个小的相连了 但是访问不到 导致得到结果偏大的问题

例如下面的这个案例

如果按照错误的执行 将是这样子的 执行顺序

得到的结果会是2 正确是1

正确的执行顺序

相关推荐
白杨尚青7 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
Jasmine_llq7 小时前
《P17461 [GESP202609 八级] 生成树计数》
算法·栈·tarjan 算法·边双连通分量·深度优先搜索 dfs·tarjan 保存当前路径节点·模乘法
Jasmine_llq7 小时前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询
the3clipse7 小时前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
CQU_JIAKE7 小时前
10.4【A】
算法
Godspeed Zhao8 小时前
现代智能雷达技术19——算法(5)
算法
(Charon)8 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
Omics Pro8 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
Tisfy8 小时前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配
小O的算法实验室8 小时前
IEEE TEVC,学习辅助的搜索路径重构进化算法
学习·算法·重构