首页 > 其他分享 >并查集

并查集

时间:2022-08-31 10:23:10浏览次数:68  
标签:int 查集 rank yy fa xx static

https://leetcode.cn/problems/number-of-islands/

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

 

 

 

public class Daoyuone {
    static int fa[], rank[];
    static int cnt;

    public static int find(int x) {
        return fa[x] = fa[x] == x ? x : find(fa[x]);
    }

    public static void union(int x, int y) {
        int xx = find(x);
        int yy = find(y);
        if (xx != yy) {
            if (rank[xx] > rank[yy])
                fa[yy] = xx;
            else if (rank[yy] > rank[xx])
                fa[xx] = yy;
            else {
                fa[xx] = yy;
                rank[yy] += 1;
            }
            cnt--;
        }
    }

    static int dir[][] = { { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 } };

    public static int numIslands(char[][] grid) {

        int n = grid.length;
        int m = grid[0].length;
        fa = new int[m * n + 1];
        rank = new int[m * n + 1];
        for (int i = 0; i < m * n; i++)
            fa[i] = i;
        cnt = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {

                if (grid[i][j] == '1') {

                    cnt++;
                    for (int k = 0; k < 4; k++) {
                        int ii = i + dir[k][0];
                        int jj = j + dir[k][1];
                        if (ii >= 0 && ii < n && jj >= 0 && jj < m && grid[ii][jj] == '1') {
                            union(i * n + j, ii * n + jj);
                        }
                    }
                }
            }

        }
        return cnt;

    }

    public static void main(String[] args) {
        String s[] = { "11000", "11000", "00100", "00011" };
        int sn = s.length;
        int sm = s[0].length();
        char c[][] = new char[sn][sm];
        for (int i = 0; i < sn; i++) {
            for (int j = 0; j < sm; j++) {
                c[i][j] = s[i].charAt(j);
            }
        }

        System.out.println(numIslands(c));
    }
}

 

标签:int,查集,rank,yy,fa,xx,static
From: https://www.cnblogs.com/tingtin/p/16642054.html

相关文章

  • 算法提高课 第四章 数据结构之并查集
    一、并查集1250.格子游戏思路O(mlog(n))将图中的每个点看作并查集的结点,每个被画的边看作合并相邻的点的操作将图中所有点按行或列优先,从1~n*m进行编号每次进行......
  • 模拟赛 d (扫描线,三维偏序,线段树合并,并查集,线段树上二分)
    PRO题目大意:给定$N$个矩形,求连通块个数。($1\leqN,x_1,x_2,y-1,y_2\leq100000$)SOL乍一看就能知道是扫描线,不过这题的细节恐怖的要命。(std同样看不懂,自己魔改了一......
  • 种类并查集 把find变成查索引 unity变成x是y的
    真假英雄http://oj.saikr.com/contest/20/problem/K在一个小镇上,很多人都患了一个精神病,他们都认为自己是“英雄”或者“反派”中间的一种,“英雄”觉得自己是正义的一方,......
  • 1039 银河英雄传说 并查集实现蜘蛛卡牌 有bug
     链接:https://ac.nowcoder.com/acm/contest/26077/1039来源:牛客网题目描述  公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表......
  • 并查集(dsu)
    一共有n个数,编号是1∼n,最开始每个数各自在一个集合中。现在要进行m个操作,操作共有两种:Mab,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集......
  • 并查集模板
    Python版本classUF:parent={}size={}cnt=0def__init__(self,M):#初始化parent,size和cnt#self.parent={ifori......
  • luoguP3224 [HNOI2012]永无乡【线段树,并查集】
    洞庭青草,近中秋,更无一点风色。玉鉴琼田三万顷,着我扁舟一叶。素月分辉,明河共影,表里俱澄澈。悠然心会,妙处难与君说。应念岭表经年,孤光自照,肝胆皆冰雪。短发萧骚襟袖冷,稳泛......
  • 并查集
    《种类并查集》对于不能一个并查集不够用了,还需要另一个并查集,但是不能开两个数组作为两个并查集,因为两个并查集之间不能有明确的区分以样例说明:   贪心思路:很......
  • 并查集(字符串形式)
    链接classSolution{//使用Map来保存每个节点的父节点Map<String,String>par=newHashMap<>();publicString[]trulyMostPopular(String[]nam......