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


    问题:

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

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

    示例:

    输入:n = 3, edges = [[0,1],[0,2],[1,2]]
    输出:0
    解释:所有点都能互相到达,意味着没有点对无法互相到达,所以我们返回 0 。
    输入:n = 7, edges = [[0,2],[0,5],[2,4],[1,6],[5,4]]
    输出:14
    解释:总共有 14 个点对互相无法到达:
    [[0,1],[0,3],[0,6],[1,2],[1,3],[1,4],[1,5],[2,3],[2,6],[3,4],[3,5],[3,6],[4,6],[5,6]]
    所以我们返回 14 。

    思路:

    需要一个布尔类型数组记录每个节点是否被访问过,还需要map记录每个节点相邻的其他节点。通过深度优先遍历统计每个联通图的节点数。根据二项式法则,求出结果。

    代码:

    1. class Solution {
    2. public long countPairs(int n, int[][] edges) {
    3. long ans = 0;
    4. int len = edges.length;
    5. //极端情况一条边都没有,符合CN2
    6. if(len == 0){
    7. return ((long)n * (long)(n-1)) / 2;
    8. }
    9. //记录点与点之间的互通情况
    10. HashMap> map = new HashMap<>();
    11. //标志位
    12. boolean[] flag = new boolean[n];
    13. //每个联通图节点数
    14. int[] points = new int[n];
    15. for(int[] val : edges){
    16. addEdges(val[0],val[1],map);
    17. addEdges(val[1],val[0],map);
    18. }
    19. for(int i = 0;i < n; i++){
    20. if(flag[i] == false){
    21. dfs(i,i,flag,points,map);
    22. }
    23. }
    24. Arrays.sort(points);
    25. for(int i = 0; i < n; i++){
    26. if(points[i] == 0){
    27. continue;
    28. }
    29. for(int j = i+1; j < n; j++){
    30. ans += (long)points[i]*(long)points[j];
    31. }
    32. }
    33. return ans;
    34. }
    35. public void dfs(int start, int point, boolean[] flag, int[] points, HashMap> map) {
    36. ArrayList list = map.get(point);
    37. flag[point] = true;
    38. points[start]++;
    39. if(list != null){
    40. for(int next: list){
    41. if(flag[next]==false){
    42. dfs(start,next,flag,points,map);
    43. }
    44. }
    45. }
    46. }
    47. public void addEdges(int start, int point, HashMap> map){
    48. ArrayList list = map.get(start);
    49. if(list == null){
    50. list = new ArrayList<>();
    51. }
    52. list.add(point);
    53. map.put(start,list);
    54. }
    55. }

  • 相关阅读:
    [附源码]计算机毕业设计springbootSwitch交流平台
    自定义事件
    【Rust日报】2022-06-26 lnx 0.9,像 Elasticsearch 和 Algolia 这样的快速搜索引擎
    c#设计模式-行为型模式 之 备忘录模式
    SpringCloud 微服务(二)
    PMP考生如何应对新考纲?看过来!
    高级深入--day40
    计算机视觉:使用opencv实现银行卡号识别
    dubbo和springcloud问题解决——interface not allow null
    补环境框架
  • 原文地址:https://blog.csdn.net/jiangzuofengqiao/article/details/133962835