力扣-图论-6【算法学习day.56】

前言

###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.统计完全连通分量的数量

题目链接: 2685. 统计完全连通分量的数量 - 力扣(LeetCode)

题面:

分析:我的做法是通过并查集来确定哪些节点是连在一起的,然后通过集合数组来判断连在一起的节点是否互相都存在路

代码:

java 复制代码
class Solution {
    int[] parent;
    int ans = 0;
    List<Integer>[] to;
    int n;
    public int countCompleteComponents(int n, int[][] edges) {
        this.n = n;
        parent = new int[n];
        for(int i = 0;i<n;i++){
            parent[i] = i;
        }
        to = new List[n];
        Arrays.setAll(to,_->new ArrayList<>());
        for(int[] arr:edges){
            int a = arr[0];
            int b = arr[1];
            union(a,b);
            to[a].add(b);
            to[b].add(a);
        }
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i<n;i++){
            if(map.getOrDefault(find(i),-1)==-1){
                map.put(find(i),1);
                recursion(find(i));
            }
        }
        return ans;
    }
    public void recursion(int parent){
        int[] arr = new int[n];
        int count = 0;
        for(int i = 0;i<n;i++){
            if(find(i)==parent){
                arr[count++] = i;
                // System.out.println(i);
            }
        }
        if(count==1){
            ans++;
            return;
        }
        for(int i = 0;i<count-1;i++){
            for(int j = i+1;j<count;j++){
                if(!isHave(arr[i],arr[j])){
                    return;
                }
            }
        }
        ans++;
    }
    public boolean isHave(int x,int y){
        for(int a:to[x]){
            if(a==y)return true;
        }
        return false;
    }

    public int find(int x){
        if(parent[x]!=x){
            parent[x] = find(parent[x]);
        }
        return parent[x];
    }

    public void union(int a,int b){
        int pa = find(a);
        int pb = find(b);
        if(pa!=pb){
            parent[pa]=pb;
        }
    }

    public boolean isInALine(int a,int b){
        return find(a)==find(b);

    }
}

2.有向无环图中的一个节点的所有祖先

题目链接: 2192. 有向无环图中一个节点的所有祖先 - 力扣(LeetCode)

题面:

分析:我的思路是利用集合数组在遍历edges存储表示节点i可被节点j到达,然后使用递归来找祖先节点,例如beto[1] = {2,3}表示节点1可以被节点2,3到达,那么我们把2,3存入Treeset集合,然后递归找2,3可以被哪些节点到达......,Treeset可以自动去重和排序,但是亲测复杂度很高

java 复制代码
class Solution {
    List<List<Integer>> ans = new ArrayList<>();
    List<Integer>[] beto;
    public List<List<Integer>> getAncestors(int n, int[][] edges) {
         beto = new List[n];
         Arrays.setAll(beto,_->new ArrayList<>());
         for(int[] arr:edges){
            beto[arr[1]].add(arr[0]);
         }
         TreeSet<Integer> set;
         for(int i = 0;i<n;i++){
            set =  new TreeSet<>();
            recursion(i,set);
            ans.add(new ArrayList<>(set));
         }
         return ans;
    }

    public void recursion(int x,TreeSet<Integer> set){
        for(int a:beto[x]){
            if(!set.contains(a)){
                 set.add(a);
                recursion(a,set);
            }
        }
    }

}

后言

上面是力扣图论专题,下一篇是其他的习题,希望有所帮助,一同进步,共勉!

相关推荐
CoovallyAIHub9 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
NAGNIP10 小时前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo10 小时前
半开区间和开区间的两个二分模版
算法
moonlifesudo10 小时前
300:最长递增子序列
算法
CoovallyAIHub15 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub15 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
聚客AI1 天前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v1 天前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工2 天前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农2 天前
【React用到的一些算法】游标和栈
算法·react.js