​LeetCode刷题实战261:以图判树

leetcode261. 以图判树 给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。 示例 1: 输入: n = 5, 边列表 edges = [[0,1], [0,2], [0,3], [1,4]] 输出: true 示例 2: 输入: n = 5, 边列表 edges = [[0,1], [1,2], [2,3], [1,3], [1,4]] 输出: false 注意:你可以假定边列表 edges 中不会出现重复的边。由于所有的边是无向边,边 [0,1] 和边 [1,0] 是相同的,因此不会同时出现在边列表 edges 中。 立即下载

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 以图判树,我们先来看题面:

https://leetcode-cn.com/problems/graph-valid-tree/

Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to check whether these edges make up a valid tree.

给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。

示例

示例 1:

输入: n = 5, 边列表 edges = [[0,1], [0,2], [0,3], [1,4]]
输出: true

示例 2:

输入: n = 5, 边列表 edges = [[0,1], [1,2], [2,3], [1,3], [1,4]]
输出: false

注意:你可以假定边列表 edges 中不会出现重复的边。由于所有的边是无向边,边 [0,1] 和边 [1,0] 是相同的,因此不会同时出现在边列表 edges 中。

解题

https://blog.youkuaiyun.com/qq_29051413/article/details/108531255

 只要存在环,就不是一个数。进行 BFS 遍历。

定义一个二维数组 graph[][] 用来存储边的信息,如 graph[2][7] 表示结点 2 和结点 7 之间存在边。

定义一个一维数组 visited[] 用来存储结点已处理信息,如 visited[3] = true,表示结点 3 已经处理过。

从结点 0 开始进行 BFS,假设当前遍历到的结点为 cur:

1、visited[cur] = true 标记当前结点已处理;

2、找出 cur 的所有邻接结点;

3、依次把 cur 和邻接结点的边都给去掉,同时把邻接结点也设置为 true。

如果在第 3 步之前,发现 cur 的一个邻接结点的 visited[naborNode] 已经为 true ,说明存在环。

解释:如果 visited[naborNode] 为 true,说明 naborNode 是前面某个结点的邻接节点,而 cur 也是前面某个节点的邻接节点,加上 cur 和 naborNode 又是连在一起的,于是形成了环。

BFS 结束后,如果是合法的树结构,此时应该已经处理完所有节点,如果还存在某个节点 visited[node] == false,说明连通分量不为 1。

class Solution {
    public boolean validTree(int n, int[][] edges) {
        //构建邻接矩阵
        int[][] graph = new int[n][n];
        //有边的元素设置为1,没有边的元素设置为0
        for (int[] edge : edges) {
            // graph[3][4] == 1 表示 3 和 4 是连接的
            graph[edge[0]][edge[1]] = 1;
            graph[edge[1]][edge[0]] = 1;
        }
        //进行BFS
        Queue<Integer> queue = new LinkedList<>();
        //从第一个节点开始搜索,这样就不会漏掉无边图的情况
        queue.add(0);
        boolean[] visited = new boolean[n];
        while (!queue.isEmpty()) {
            Integer cur = queue.poll();
            visited[cur] = true;
            //获取邻接点
            for (int i = 0; i < n; i++) {
                //查看当前节点的邻接点
                if (graph[cur][i] == 1) {
                    if (visited[i]) {
                        // cur 的邻接节点居然被处理过
                        // 说明 cur 和 i 在前面有一个共同的父结点
                        // 加上 cur 和 i 又是连在一起的
                        // 说明存在环
                        return false;
                    }
                    visited[i] = true;
                    //涂黑访问过的节点
                    graph[cur][i] = 0;
                    graph[i][cur] = 0;
                    queue.add(i);
                }
            }
        }

        //判断是否为单连通分量
        for (int i = 0; i < n; i++) {
            if (!visited[i]) {
                // 居然还有一个节点没有被访问过,说明不是图
                return false;
            }
        }
        return true;
    }
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-260题汇总,希望对你有点帮助!

Python爬虫实战:使用Scrapy+Playwright高效获取电力市场数据 本文将详细介绍如何使用Python构建一个高效的电力市场数据爬虫系统。我们将结合Scrapy框架和Playwright浏览器自动化工具,解决电力市场网站常见的反爬机制,实现数据的稳定抓取。文章包含完整的项目搭建流程、代码实现、数据处理方案以及部署建议,帮助读者掌握现代爬虫开发的核心技术。关键词:Python爬虫、Scrapy、Playwright、电力市场、数据采集、反爬对策python复制下载# 基本字段region = scrapy.Field() # 区域。 阅读详情

相关推荐

多个MOS管并联应用场景的四大要点

动态运行时,阈值电压Vgsth最低的MOS管首先打开,最后关闭。这种MOS管一般会占据更多的开关损耗,并且在开关转换过程中,承担了更高的电应力。

VBsemi的博客 3750

leetcode:261. 以图判树

使用并查集,当一条边的两个节点已经处于联通状态时,新加的边就肯定构成了环。

OceanStar的博客 733

手把手配置:用Synopsys VDK为英飞凌TC4x系列MCU做虚拟原型开发

本文详细介绍了如何使用Synopsys VDK为英飞凌TC4x系列MCU进行虚拟原型开发,涵盖开发环境搭建、关键外设虚拟化配置、AUTOSAR栈集成及虚拟调试与性能调优全流程。通过虚拟原型技术,开发者可提前6-12个月启动软件开发,显著提升汽车电子项目的开发效率。

weixin_30606461的博客 292

LeetCode:261. 以图判树 - Python

给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。

Growth Diary 676

Arduino for ESP32-----ESP-NOW介绍及使用

ESP-NOWESP-NOW介绍ESP-NOW支持以下特性ESP-NOW技术也存在以下局限性获取ESP32的MAC地址ESP-NOW单向通信(One-way communication)ESP32单板间的双向通信一对多通信(一发多收)一对多通信(多发一收) ESP-NOW介绍 ESP-NOW是一种由Espressif开发的协议,可以让多个设备在不使用Wi-Fi的情况下相互通信。该协议类似于低功耗的2.4GHz无线连接。设备之间的配对需要在通信之前完成。配对完成后,连接是安全的、点对点的,不需要握手。这意味着

Better_man1的博客 2万+

【一张图系列】别再混淆了!5分钟搞懂ERP、MES、PLC的职责边界与数据流》

《ERP、MES、PLC系统边界与协作解析》一文清晰阐述了制造业三大核心系统的角色分工与数据流转。文章将ERP比作企业"大脑"负责战略规划,MES作为车间"指挥官"负责执行调度,PLC则是设备"士兵"执行具体操作。通过一张架构图展示了从计划层到控制层的完整信息流:蓝色箭头表示指令下行(ERP→MES→PLC),橙色箭头代表数据上行反馈(PLC→MES→ERP)。文章强调理清系统边界对数字化转型、部门协作和项目实施的关键作用,并预告下期将深入解析ME

「东哥说MES」 专注于MES制造执行系统,为你拆解核心架构、功能模块及与ERP/PLC的集成逻辑。提供从入门到精通的系列干货、精选行业报告与实用工具,构建你的数字化知识体系,关注我,用实战经验照亮你的数字化之路。 973

[Leetcode] 261. Graph Valid Tree

这题本质并不复杂, 只是操作起来略烦和需要小心 一个图是否为树,判断条件有二:1.是否存在环。2.是否0 ~ n - 1这n个点都被走完了,也就是木有orphan nodes 所以整个流程基本就是:根据输入建图,然后遍历图找环,无环而且走过的节点数为n即是树。 构图的方式很多种,可以自己开一个class。如果懒得这么做,一般用哈希表也可以HashMap&lt;Integer(父亲节点),Ha......

chaochen1407的专栏 909

三菱FX5U PLC与CCLINK模块通信配置全流程(附接线图与参数详解)

本文详细解析了三菱FX5U PLC与CCLINK模块的通信配置全流程,包括硬件接线规范、参数设置及软件编程方法。通过实战指南帮助工程师快速掌握FX5U与CCLINK模块的高效通信技术,提升工业自动化控制系统的稳定性和可靠性。

weixin_27014595的博客 433

【Leetcode】261. Graph Valid Tree

基本思想是这样的,构造一个并查集,每次遍历一条边的时候先查一下两个顶点是否已经属于同一个集合了,如果是,那就说明有环。一个图是一棵树当且仅当其顶点数等于边数加。

数学、算法爱好者的博客 777

OpenHarmony之Histreamer引擎深度解析:pipeline_core架构如何全面取代GStreamer,一统音视频播放与录制

Histreamer是OpenHarmony多媒体框架的核心媒体引擎,采用架构设计。一个轻量级的媒体引擎组件,提供播放、录制等场景的媒体数据流水线处理。1.播放场景分为如下几个节点:数据源读取、解封装、解码、输出;2.录制场景分为如下几个节点:数据源读取、编码、封装、输出。该引擎从OH5.0开始取代了原有的媒体引擎gstreamer(部分文档还保留较老架构的讲解),提供统一的音视频播放、录制、元数据解析等能力。

m0_67505153的博客 333

图像处理之边缘检测[微分算子、Canny算子和LOG算子]

LOG算子是在经典算子的基础上发展起来的边缘检测算子,根据信噪比求得检测边缘的最优滤波器。边缘总是以强度突变的形式出现,可以定义为图像局部特性的不连续性,如灰度的突变和纹理结构的突变等。图像的边缘包含了物体形状的重要信息,它不仅在分析图像时大幅度地减少了要处理的信息量,而且还保护了目标的边界结构。对于复杂的图像,采用Roberts算子不能较好地得到图像的边缘,而需要采用更加复杂的3X3的算子比如Prewitt算子。对于离散的图像f(x,y),边缘检测算子是用图像的垂直和水平差分来逼近梯度算子,即。

qq_44111805的博客 9837

【LeetCode - 261】以图判树

【中等】BFS、DFS、并查集、图

学哥斌的博客 2634

Autosar配置——导入DBC后配置SecOC同步报文和同步请求报文

在Autosar中,安全性是一个重要的考虑因素,而SecOC(Secure On-Board Communication)是一种用于保护通信数据完整性和安全性的安全机制。在上述示例中,我们配置了同步报文和同步请求报文的属性。接下来,我们需要在Autosar中配置同步报文和同步请求报文。同步报文用于在通信双方之间同步SecOC状态,而同步请求报文用于请求SecOC的状态信息。通过以上配置,我们成功地导入了DBC文件,并在Autosar系统中配置了SecOC同步报文和同步请求报文。希望以上信息对您有所帮助!

CyberSphinx的博客 649

LeetCode第261题_以图判树

本文详细解析LeetCode第261题"以图判树",这是一道图论问题。文章提供了从DFS到并查集的多种解法,包含C#、Python、C++三种语言实现,配有详细的算法步骤图解和性能分析。适合想要深入理解图论算法和树的性质的算法学习者。

qq_40263592的博客 2603

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【中等】力扣算法题解析LeetCode261:以图判树

题目要求判断给定的无向图是否能构成一棵树,需满足两个条件:无环且连通。通过并查集高效检测环和连通性,步骤如下: 边界检查:边数必须为 n-1,否则直接返回 false; 初始化并查集,每个节点自成一个集合; 遍历边并合并集合:若边的两端节点同根,说明存在环;否则合并集合; 连通性验证:若边数正确且无环,则必连通。

ylumwd的博客 1086

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Leetcode 261.以图判树

Time: 20190903 Type: Medium 题目描述 给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。 示例 1: 输入: n = 5, 边列表 edges = [[0,1], [0,2], [0,3], [1,4]] 输出: true 示例 2: 输入: n = 5, 边列表 edge...

Bing's Blog 7722

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Leetcode 261. 以图判树

给定一个整数 n 和一个 edges 列表,其中 edges[i] = [ai, bi] 表示图中节点 ai 和 bi 之间存在一条无向边。第二步,遍历所有的边,将相关相连的点进行连接,如果边的两端都在同一个集合中,则代表存在环,直接返回false。如果这些边能够形成一个合法有效的树结构,则返回 true ,否则返回 false。第三步,如果图中无环,则只要并查集中的集合数为1就能保证图能构建成熟。第三步,如果图中无环且只有一个连通分量则可以构建成树。第一步,构建并查集,并将所有的节点添加到并查集中。

m0_51437455的博客 450

LeetCode-Python-261. 以图判树

给定从 0 到 n-1标号的n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。 示例 1: 输入: n = 5, 边列表 edges = [[0,1], [0,2], [0,3], [1,4]] 输出: true 示例 2: 输入: n = 5, 边列表 edges = [[0,1], [1,2], [2,3], [1,3...

Keep Coding 3295

LeetCode 261. 以图判树(全部连通+边数=V-1)

文章目录1. 题目2. 解题 1. 题目 给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示), 请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。 示例 1: 输入: n = 5, 边列表 edges = [[0,1], [0,2], [0,3], [1,4]] 输出: true 示例 2: 输入: n = 5, 边列表 edges = [[0,1], [1,2], [2,3], [1,3], [1,4]] 输出: false 注意:你可以假定边列表 edge

Michael是个半路程序员 3827

leetcode 261. 以图判树

并查集来求有几个独立的图,存在两个图就不是树,还可以用深度优先搜索来看有几棵树;是否存在环,需要用哈希表,存储每条边是否访问过,访问过得边不能再次访问,看是否有重复访问的节点就行,只要边不重复存在节点重复就存在环的。 作者:九是否随意的称呼 链接:https://leetcode.cn/problems/graph-valid-tree/solutions/2746438/261-yi-tu-pan-shu-by-shiheyingzhe-vozd/ 来源:力扣(LeetCode) 著作权归作者所有。商业

邹九的个人博客 609

LeetCode 261:以图判树 | 并查集

树的特点:V 个节点恰好有 V-1 条边,且无环。

cannonjinx的博客 2735

leetcode | c++ | 第261题 | 以图判树

以图判树

iCling的博客 361

LeetCode 261-270 题详细解析

​:有一排房子,每个房子可以用k种颜色中的一种来粉刷,每个房子粉刷成不同颜色的花费不同。​:给定编号从 0 到 n-1 的 n 个节点和一个无向边列表,判断这些节点能否形成一棵有效的树。动态规划优化,记录前一个房子的最小花费和次小花费,避免每次都要遍历所有颜色。​:给定一个包含[0, n]中n个数的数组,找出数组中缺失的那个数字。方法1:数学公式 - 计算0到n的和,减去数组中所有数的和。​:给定一个按外星字典序排序的单词列表,推断出字母的顺序。​:找出第n个丑数(只包含质因数2、3、5的正整数)。

fengruxue的专栏 472

leetcode | go | 第261题 | 以图判树

以图判树

iCling的博客 194

LeetCode 261. Graph Valid Tree(判断图是否为树)

原题网址:https://leetcode.com/problems/graph-valid-tree/ Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to check whether these

James Pan 8347
上一篇: Redis之下,大兵SDS的复仇之旅 !
下一篇: 一款小清新的 SpringBoot+ Mybatis 前后端分离后台管理系统项目
编程IT圈
博客等级 码龄6年 1130粉丝 544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值