• 【算法集训 | 暑期刷题营】7.27题---并查集


    算法集训传送门

      👉引言

    在这里插入图片描述

    铭记于心
    🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

    💖 ❄️我们的算法之路❄️💖

       众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
                  ☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
       💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs),💝宽度优先搜索(bfs),💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉

    在这里插入图片描述


    今日主题:并查集


     👉⭐️第一题💎

       ✨题目

          Loading Question… - 力扣(LeetCode)

    在这里插入图片描述

       ✨代码

    class Solution {
    public:
        void dfs(vector<vector<int>>& isConnected, vector<int>& visited, int cities, int i) {
            for (int j = 0; j < cities; j++) {
                if (isConnected[i][j] == 1 && !visited[j]) {
                    visited[j] = 1;
                    dfs(isConnected, visited, cities, j);
                }
            }
        }
    
        int findCircleNum(vector<vector<int>>& isConnected) {
            int cities = isConnected.size();
            vector<int> visited(cities);
            int provinces = 0;
            for (int i = 0; i < cities; i++) {
                if (!visited[i]) {
                    dfs(isConnected, visited, cities, i);
                    provinces++;
                }
            }
            return provinces;
        }
    };
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

     👉⭐️第二题💎

       ✨题目

          Loading Question… - 力扣(LeetCode)

    在这里插入图片描述

       ✨思路

    思路

       ✨代码

    class Solution {
    public:
        bool containsCycle(vector<vector<char>>& grid) {
            g = grid;
            vi = vector<vector<bool>>(g.size(), vector<bool>(g[0].size(), false));
    
            for (int i = 0; i < g.size(); i++) {
                for (int j = 0; j < g[i].size(); j++) {
                    if (g[i][j] == '.') continue;
                    if (dfs(g[i][j], i, j, -1, -1)) return true;
                }
            }
            return false;
        }
    
        bool dfs(char c, int x, int y, int px, int py) {
            if (x < 0 || x >= g.size() || y < 0 || y >= g[0].size()) return false;
            if (g[x][y] != c) return false;
            if (vi[x][y]) return true;
            vi[x][y] = true;
            for (auto d : dd) {
                int dx = x + d[0];
                int dy = y + d[1];
                if (dx == px && dy == py) continue;
                if (dfs(c, dx, dy, x, y)) return true;
            }
            vi[x][y] = false;
            g[x][y] = '.';
            return false;
        }
    
    private:
        vector<vector<char>> g;
        vector<vector<bool>> vi;
        vector<vector<int>> dd = { {0,1}, {0,-1}, {1,0}, {-1,0} };
    };
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

     👉⭐️第三题💎

       ✨题目

          Loading Question… - 力扣(LeetCode)
    在这里插入图片描述

       ✨代码

    class UnionFind {
      constructor(n) {
        this.parent = new Array(n);
        this.size = new Array(n);
        this.count = n; // 本题用不到
        this.init(n);
      }
      init(n) {
        let parent = this.parent;
        let size = this.size;
        for (let i = 0; i < n; i++) {
          parent[i] = i;
          size[i] = 1;
        }
      }
      find(x) {
        let parent = this.parent;
        while (x != parent[x]) {
          parent[x] = parent[ parent[x] ];
          x = parent[x];
        }
        return x;
      }
      union(p, q) {
        let rootP = this.find(p);
        let rootQ = this.find(q);
        if (rootP == rootQ) {
          return ;
        }
        let parent = this.parent;
        let size = this.size;
        if (size[rootP] > size[rootQ]) {
          parent[rootQ] = rootP;
          size[rootP] += size[rootQ];
        } else {
          parent[rootP] = rootQ;
          size[rootQ] += size[rootP];
        }
        this.count--;
      }
      connected(p, q) {
        return this.find(p) == this.find(q);
      }
    }
    var findRedundantConnection = function(edges) {
      let len = edges.length;
      let union = new UnionFind(len);
      let rest = [];
      for (let i = 0; i < edges.length; i++) {
        let [x, y] = edges[i];
        if (union.connected(x, y)) {
          rest.push([x, y]);
        } else {
          union.union(x, y);
        }
      }
      return rest.pop();
    };
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    🌹写在最后💖
    相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!🌹🌹🌹在这里插入图片描述

  • 相关阅读:
    html和css基础练习
    云导最后一次课的笔记和更新linux软件列表
    python datetime模块
    【论文阅读笔记】PA-SAM: Prompt Adapter SAM for High-Quality Image Segmentation
    5个用于地理空间数据分析的Python包
    redis如何测试
    驱动开发:内核枚举LoadImage映像回调
    QT 系统学习 day01 了解各种控件,学习信号槽,QPushbutton
    C#.Net筑基-模式匹配汇总
    Wirshark学习笔记
  • 原文地址:https://blog.csdn.net/runofsun/article/details/126009235