2316. 统计无向图中无法互相到达点对数(leetcode)并查集-------------------Java实现

2316. 统计无向图中无法互相到达点对数(leetcode)并查集-------------------Java实现

题目表述

给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 ai 和 bi 之间有一条无向边。

请你返回 无法互相到达 的不同 点对数目

样例

2316. 统计无向图中无法互相到达点对数(leetcode)并查集-------------------Java实现_第1张图片

条件

1 <= n <= 105
0 <= edges.length <= 2 * 105
edges[i].length == 2
0 <= ai, bi < n
ai != bi
不会有重复边。

思路

使用并查集,并通过一个size数组记录并查集长度。

注意点

ac代码

Java:
class Solution {
    public int find(int n,int[] parent){
        if(parent[n] == n)
        return n;
        parent[n] = find(parent[n],parent);
        return parent[n];
    }
    public void union(int number1,int number2,int[] parent,int[] size)
    {
        int num1 = find(number1,parent);
        int num2 = find(number2,parent);

        if(parent[num1]!=parent[num2])
        {
            if(size[num1]>=size[num2])
            {
                size[num1] += size[num2];
                parent[num2] = parent[num1];
            }
            else{
                size[num2] += size[num1];
                parent[num1] = parent[num2];
            }
        }
        return;
    }
    public long countPairs(int n, int[][] edges) {
        int[] parent = new int[n];
        int[] size = new int[n];
        long result = 0;
        for(int i = 0;i<n;i++)
                parent[i] = i;
        Arrays.fill(size,1);
        for(int[] now:edges)
            union(now[0],now[1],parent,size);
        for(int i=0;i<n;i++)
        result+=(n-size[find(i,parent)]);
        return result/2;
    }
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(leetcode,java,算法)