LeetCode.冗余连接(并查集以及广度优先搜索)

news2024/11/7 11:23:34

684.冗余连接|

传送门:. - 力扣(LeetCode)

树可以看成是一个连通且 无环 的 无向 图。

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。

请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的那个。

这个题呢有很多选择,可以用广搜也可以并查集应该还有别的办法,这里我介绍并查集的办法,我认为这道题是最适合并查集的,因为首先这道题是无向图,其次把题目转换一下就是问你连成环的边是那条边,这条边就是答案,因此并查集其实是优解

代码

class Solution {
    static const int N = 1e3 + 10;
    int p[N];
public:
    int find(int x){
        if(x == p[x]) return x;
        else return p[x] = find(p[x]);
    }
    vector<int> findRedundantConnection(vector<vector<int>>& edges) {
        int n = edges.size();
        for(int i = 1;i <= n;i ++) p[i] = i;

        for(auto arr : edges){
            int a = arr[0],b = arr[1];
            int A = find(a), B = find(b);
            // cout << A << " " << B << endl;
            if(A != B) p[A] = B;
            else return arr;
        }

        return {};
    }
};

 685.冗余连接||

传送门. - 力扣(LeetCode)

在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。

输入一个有向图,该图由一个有着 n 个节点(节点值不重复,从 1 到 n)的树及一条附加的有向边构成。附加的边包含在 1 到 n 中的两个不同顶点间,这条附加的边不属于树中已存在的边。

结果图是一个以边组成的二维数组 edges 。 每个元素是一对 [ui, vi],用以表示 有向 图中连接顶点 ui 和顶点 vi 的边,其中 ui 是 vi 的一个父节点。

返回一条能删除的边,使得剩下的图是有 n 个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。

这道题呢就复杂了一些了,变成有向图了,那么一旦变成有向图了,并查集就不好使了,这里介绍广搜的办法。

其实没有什么高级的思路,就是写bfs暴力枚举直到符合条件,写不出来的话,就要去多练代码了

这里介绍一些C++的语法

Lambda匿名函数

就比如auto bfs = [&]():

这样的写法是在 C++ 中定义一个 Lambda 表达式(匿名函数)。这里的 bfs 是 Lambda 表达式的名称,通常用来创建一个可以在后续代码中调用的函数。让我们逐部分解析一下这个写法:

  1. auto:这表示编译器会自动推导出 bfs 的类型。通常用于简化类型声明。

  2. bfs:这是你定义的 Lambda 表达式的名称,可以用来在后面的代码中调用它。

  3. [&]:这是 Lambda 表达式的捕获列表。在这里,& 表示按引用捕获外部作用域的所有变量。这意味着 Lambda 表达式内部可以访问并修改外部变量。

  4. ():这是 Lambda 表达式的参数列表。在这个例子中,参数列表为空,意味着这个 Lambda 不接受任何参数。

  5. {}(虽然在你的例子中没有展示):在 Lambda 表达式中,函数体用大括号 {} 包围。在这里,你可以编写要执行的代码逻辑。

remove函数

remove(g[x].begin(), g[x].end(), y)std::remove 是一个算法,用于重新排列容器的元素。它会把所有与 y 相等的元素移动到容器的末尾,并返回一个指向新逻辑尾部的迭代器。注意,这并不会真正删除这些元素,而是通过移动它们来“删除”。

  • g[x].begin()g[x].end() 分别是 g[x] 的起始和结束迭代器。
  • y 是要删除的元素。

配合erase用

erase函数

g[x].erase(..., g[x].end())erasestd::vector 的成员函数,用于真正删除元素。它接受两个迭代器作为参数,删除这两个迭代器之间的元素。在这里,第一个参数是 std::remove 返回的新逻辑尾部的迭代器,第二个参数是 g[x].end()

代码

class Solution {
    static const int N = 1e3 + 10;
    int ind[N];
    bool st[N];
    vector<int> e[N];
public:
    vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges) {
        int n = edges.size();
        for(auto arr : edges){
            int x = arr[0], y = arr[1];
            ind[y] ++, e[x].push_back(y);
        }

        auto bfs = [&](){
            memset(st,false,sizeof(st));

            queue<int> q;
            for(int i = 1;i <= n;i ++){
                if(!ind[i]) q.push(i);
            }

            if(q.empty() || q.size() > 1) return false;

            int sum = 1;
            while(!q.empty()){
                auto t = q.front();
                q.pop();
                st[t] = true;

                for(auto x : e[t]){
                    if(st[x]) continue;
                    q.push(x);
                    sum ++;
                }
            }

            return sum == n; 
        };

        for(int i = n - 1;i >= 0;i --){
            int x = edges[i][0], y = edges[i][1];
            ind[y] --;
            e[x].erase(remove(e[x].begin(), e[x].end(), y), e[x].end());
            if(bfs()) return edges[i];
            ind[y] ++;
            e[x].push_back(y);
        }

        return {};
    }
};

 加油

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文彻底整明白,基于Ollama工具的LLM大语言模型Web可视化对话机器人部署指南

在上一篇博文中&#xff0c;我们在本地部署了Llama 3 8B参数大模型&#xff0c;并用 Python 写了一个控制台对话客户端&#xff0c;基本能愉快的与 Llama 大模型对话聊天了。但控制台总归太技术化&#xff0c;体验不是很友好&#xff0c;我们希望能有个类似 ChatGPT 那样的 Web…

BES2600WM---HiLink RM56 EVK

0 Preface/Foreword 1 环境搭建 1.1 安装依赖工具 sudo apt-get install build-essential gcc g make zlib* libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-boot-tools mtd-utils…

Leetcode21:合并两个有效链表

原题地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示…

51c嵌入式~IO合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12383193 一、单片机通信数据接收解析方法 前阵子一朋友使用单片机与某外设进行通信时&#xff0c;外设返回的是一堆格式如下的数据&#xff1a; AA AA 04 80 02 00 02 7B AA AA 04 80 02 00 08 75 AA AA 04 80 02 00 9B E2…

java或c#是如何对数据库的表字段加密的处理的?

对于表格数据的加密处理&#xff0c;通常涉及到对数据库中存储的数据进行加密&#xff0c;以保护敏感信息。 Java示例&#xff08;使用AES算法加密数据库表数据&#xff09; 首先&#xff0c;你需要一个数据库连接&#xff0c;这里假设你使用的是JDBC连接MySQL数据库。以下是…

Android Studio Dolphin 下载、安装与配置教程

文章目录 Android Studio Dolphin简介一、核心特性二、新增功能三、用户体验优化 一&#xff0c;下载百度网盘迅雷云盘 二&#xff0c;安装三&#xff0c;下载组件四&#xff0c;添加SDK五&#xff0c;创建项目六&#xff0c;安装 Device模拟器运行项目 Android Studio Dolphin…

java开发等一些问题,持续更新

微服务和单服务的区别 微服务&#xff08;Microservices&#xff09;和单体服务&#xff08;Monolithic Architecture&#xff09;是两种不同的软件架构风格&#xff0c;各有其特点和适用场景。 微服务架构&#xff1a; 模块化&#xff1a; 微服务架构将应用程序分解为一系列小…

全国分省灵活就业情况数据集(2015-2019年)

数据简介&#xff1a;就业是民生之本&#xff0c;是“六稳”“六保”之首&#xff0c;对于拥有14亿人口的中国而言&#xff0c;就业问题至关重要。“十四五”规划建议中指出&#xff0c;应强化就业优先政策&#xff0c;千方百计稳定和扩大就业&#xff0c;实现更充分更高质量就…

杂货 | 每日资讯 | 2024.10.31

注意&#xff1a;以下内容皆为AI总结 在2024年10月30日&#xff0c;人工智能领域涌现出一些重要的新发展和大事件。这些新进展涉及人工智能在金融、搜索技术以及大型科技公司业务扩展中的广泛应用。本文将详细解读当天的几大AI事件&#xff0c;以便大家更好地理解当今AI技术的…

分享几款开源好用的图片在线编辑,适合做快速应用嵌入

图片生成器是指一种工具或软件&#xff0c;用于自动生成图片或图像内容&#xff0c;通常依据用户设定的参数或模板进行操作。这种工具能够帮助用户快速创建视觉效果丰富的图像&#xff0c;而无需具备专业的设计技能。 在数字化时代&#xff0c;图片编辑已经成为日常工作和生活的…

elasticsearch 8.x 插件安装(四)之简繁体插件

elasticsearch 8.x 插件安装&#xff08;四&#xff09;之简繁体插件 elasticsearch插件安装合集 elasticsearch插件安装&#xff08;一&#xff09;之ik分词器安装&#xff08;含MySQL更新&#xff09; elasticsearch 8.x插件&#xff08;二&#xff09;之同义词安装如何解…

WPS查询函数VLOOKUP,匹配寻找值自动带入值

想实现在下表输入物料名称后&#xff0c;把上表中的单位自动带入 那就要用到VLOOKUP函数&#xff0c;获取第2个表第1列的值后去第1个表的第1列匹配&#xff0c;匹配到后得到行数值&#xff0c;把第1个表的第2列赋值给第2个表的第2列。 Vlookup函数参数为Vlookup(查找值&#…

burp靶场-User ID controlled by request parameter with password disclosure

Lab: 由具有密码泄露功能的请求参数控制的用户 ID 实验描述&#xff1a; This lab has user account page that contains the current user’s existing password, prefilled in a masked input. 此实验室具有用户帐户页面&#xff0c;其中包含当前用户的现有密码&#xff0c;…

Hive的数据存储格式

目录 一、前言 二、存储格式 2.1、文本格式&#xff08;TextFile&#xff09; 2.1.1、定义与特点 2.1.2、存储与压缩 2. 1.3、使用场景 2.2、行列式文件&#xff08;ORCFile&#xff09; 2.2.1、ORC的结构 2.2.2、ORC的数据类型 2.2.3、ORC的压缩格式 2.2.3、ORC存储…

银河麒麟v10 xrdp安装

为了解决科技被卡脖子的问题&#xff0c;国家正在大力推进软硬件系统的信创替代&#xff0c;对于一些平时对Linux操作系统不太熟练的用户来讲提出了更高的挑战和要求。本文以银河麒麟v10 24.03为例带领大家配置kylin v10的远程桌面。 最近公司为了配置信创开发新购了几台银河麒…

工作流管理是什么?5款企业工作流管理工具推荐!

一、工作流管理 工作流管理是一个被业界广泛应用并迅速发展的技术。它主要是使处理过程自动化&#xff0c;使人以及各种应用工具相互之间协调工作&#xff0c;以完成某项工作。其目的是让合适的人或软件在恰当的时间执行正确的工作。通俗来说&#xff0c;工作流管理就是对业务…

逗号运算符应用举例

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用set…

小新学习k8s第四天之发布管理

一、金丝雀发布&#xff08;灰度发布&#xff09; Deployment控制器支持自定义控制更新过程中的滚动节奏&#xff0c;如“暂停(pause)”或“继续(resume)”更新操作。 ①比如等待第一批新的Pod资源创建完成后立即暂停更新过程&#xff0c;此时&#xff0c;仅存在一部分新版本的…

工业网络监控中的IP保护与软件授权革新

未来的智能工厂离不开稳定而高效的通信网络&#xff0c;这些网络在支撑生产流程的同时&#xff0c;也面临着复杂的管理与安全挑战。PROCENTEC推出了一系列硬件和软件产品&#xff0c;如Atlas、Mercury和Osiris&#xff0c;以提供全面的网络监控和故障排除能力。然而&#xff0c…

写在第六个“深圳企业家日”,看KPaaS如何助力企业数字化转型

每年的11月1日是“深圳企业家日”&#xff0c;这是深圳为表彰本地企业家精神而设立的纪念日。这一天&#xff0c;深圳的创业者和企业家们聚集一堂&#xff0c;总结过往&#xff0c;展望未来。企业家们在深圳的经济发展、技术创新和社会进步中扮演了重要角色&#xff0c;而这一天…