Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

    • 46.全排列
    • 93.复原IP地址
    • 1079.活字印刷
    • 6441. 求一个整数的惩罚数
    • 47. 全排列 II
    • 78. 子集
    • 79. 单词搜索
    • 207. 课程表
    • 399. 除法求值
    • 22. 括号生成
    • 39. 组合总和
    • 2746. 字符串连接删减字母
    • 931. 下降路径最小和
    • 40. 组合总和 II
    • 332. 重新安排行程
    • 51. N 皇后
    • 37. 解数独
    • 2050. 并行课程 III
    • 841. 钥匙和房间
    • 2850. 将石头分散到网格图的最少移动次数
    • 2316. 统计无向图中无法互相到达点对数
    • 剑指offer12
    • 剑指offer38
  • 数学贪心

  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 深搜回溯
phan
2023-10-21

2316. 统计无向图中无法互相到达点对数

# 2316. 统计无向图中无法互相到达点对数 (opens new window)

# 1.深搜+连通分量

思路:如果需要彻底遍历判断每两个节点是否联通,则时间复杂度比较高。弗洛伊德算法n*3

实际上,我们只需要计算出每个连通分量的大小,联通分量内任意两个节点之间肯定是连通的。

假设当前连通分量的大小为k,那么当前连通分量的无法到达点对数为k*(n-k)。

class Solution {
    Map<Integer,Set<Integer>> map=new HashMap<>();
    public long countPairs(int n, int[][] edges) {
        long res=0;
        for (int i = 0; i < edges.length; i++) {
            int x = edges[i][0];
            int y = edges[i][1];
            if(!map.containsKey(x)) map.put(x, new HashSet<>());
            if(!map.containsKey(y)) map.put(y, new HashSet<>());
            Set<Integer> set1 = map.get(x);
            Set<Integer> set2 = map.get(y);
            set1.add(y);
            set2.add(x);
        }
        Set<Integer> set=new HashSet<>();
        Set<Integer> visit=new HashSet<>();
        for(int i=0;i<n;i++){
            if(!set.contains(i)){
                visit.clear();
                visit.add(i);
                find(i,visit);
                int a=n-set.size()-visit.size();
                res+=1l*a*visit.size();
                set.addAll(visit);
            }
        }
        return res;
    }
    public void find(int start,Set<Integer> visit){
        if(map.containsKey(start)){
            Set<Integer> currSet=map.get(start);
            for (Integer next : currSet) {
                if (!visit.contains(next)) {
                    visit.add(next);
                    find(next, visit);
                }
            }
        }
    }
}
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
编辑 (opens new window)
#Leetcode#回溯
上次更新: 2023/12/15, 15:49:57
2850. 将石头分散到网格图的最少移动次数
剑指offer12

← 2850. 将石头分散到网格图的最少移动次数 剑指offer12→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式