并查集(UnionFind) 系列

2021/11/21 6:09:51

本文主要是介绍并查集(UnionFind) 系列,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

547. Number of Provinces

Medium

There are n cities. Some of them are connected, while some are not. If city a is connected directly with city b, and city b is connected directly with city c, then city a is connected indirectly with city c.

A province is a group of directly or indirectly connected cities and no other cities outside of the group.

You are given an n x n matrix isConnected where isConnected[i][j] = 1 if the ith city and the jth city are directly connected, and isConnected[i][j] = 0 otherwise.

Return the total number of provinces.

Example 1:

Input: isConnected = [[1,1,0],[1,1,0],[0,0,1]]
Output: 2

Example 2:

Input: isConnected = [[1,0,0],[0,1,0],[0,0,1]]
Output: 3

Constraints:

  • 1 <= n <= 200
  • n == isConnected.length
  • n == isConnected[i].length
  • isConnected[i][j] is 1 or 0.
  • isConnected[i][i] == 1
  • isConnected[i][j] == isConnected[j][i]

解法1: 并查集

class Solution {
    public int findCircleNum(int[][] isConnected) {
        //1.for loop len elements do unionfind
        UnionFind uf = new UnionFind(isConnected.length);
        for(int i=0;i<isConnected.length;i++){
            for(int j=0;j<isConnected.length;j++){
                if(i!=j && isConnected[i][j]==1) {
                    uf.union(i,j);
                }
            }
        }
        //2.count the parent[i]=i
        int count = 0;
        for(int i=0;i<isConnected.length;i++) 
            if(uf.parent[i]==i) count++;
        return count;
    }
    //UnionFind implementation
    class UnionFind{
        int[] parent;
        int[] rank;
        UnionFind(int n){
            parent = new int[n];
            rank = new int[n];
            for(int i=0;i<n;i++) parent[i]=i;
        }
        public int findParent(int x){
            if(x==parent[x]) return x;
            parent[x] = findParent(parent[x]);
            return parent[x];
        }
        public void union( int x,int y ){
            int px = findParent(x);
            int py = findParent(y);
            if(px==py) return;
            if(rank[px]>rank[py])    parent[py]=px;
            else if(rank[px]<rank[py]) parent[px]=py;
            else{
                parent[px]=py;
                rank[py]++;
            }
        }
    }
}

 解法二: dfs

class Solution {
    public int findCircleNum(int[][] isConnected) {
        //defind visited
        int len = isConnected.length;
        boolean[] visited = new boolean[len];
        //for loop 0 ~ len-1  recursively find its connections
        int count = 0;
        for(int i=0;i<len;i++){
            if(visited[i]) continue;
            count++;
            dfs(isConnected,i,visited);
        }
        return count;
    }
    private void dfs(int[][] isConnected,int i,boolean[] visited){
        int len = isConnected.length;
        visited[i]=true;
        for(int j=0;j<len;j++){
            if(isConnected[i][j]==1 && !visited[j] ) dfs(isConnected,j,visited);
        }
    }
}

 



这篇关于并查集(UnionFind) 系列的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程