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

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 {};
    }
};

 加油

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

上线 24 小时,爆了!

产研团队&#xff08;兼客服&#xff09;已爆单&#x1f525;&#x1f680;&#x1f4a5;&#xff01;&#xff08;bushi&#xff09; 在此由衷感谢各位小伙伴的信任&#x1f929;&#xff01; 还没有试用的小伙伴赶紧去围观&#x1f447;️&#x1f447;️&#x1f447;️ …

高效数据集成案例:从聚水潭·奇门到MySQL

聚水潭奇门数据集成到MySQL的技术案例分享 在企业信息化建设中&#xff0c;数据集成是实现业务流程自动化和数据统一管理的关键环节。本文将分享一个具体的系统对接集成案例&#xff1a;如何将聚水潭奇门平台上的销售出库单数据高效、可靠地集成到MySQL数据库中&#xff0c;以…

AUTOSAR-Com模块

COM 文章目录 COMCOM 基础介绍COM主要功能AUTOSAR COM 模块 发送模型Signal 信号/信号组发送信号属性—Triggered属性Pending属性信号的初始化信号的对齐方式&#xff08;大小端&#xff09;信号的收发发送接收 字节序转换和符号扩展信号的过滤机制过滤处理信号传输模式信号流和…

【十进制转十六进制数】

【十进制转十六进制数】 C语言版本C 版本Java版本Python版本 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 从键盘接收一个整数&#xff0c;编程实现将其转换成十六进制数。 输入 一个整数 输出 十六进制数 样例输入 100样例输出 6…

day01-ElasticStack+Kibana

ElasticStack-数据库 #官网https://www.elastic.co/cn/ #下载7.17版环境准备 主机名IP系统版本VMware版本elk110.0.0.91Ubuntu 22.04.417.5.1elk210.0.0.92Ubuntu 22.04.417.5.1elk310.0.0.93Ubuntu 22.04.417.5.1 单机部署ES 1.下载ES软件包&#xff0c;放到/usr/local下 […

HTML3D旋转相册

文章目录 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐

react18中react-thunk实现公共数据仓库的异步操作

redux及react-redux都只能实现数据的同步修改更新&#xff0c;有点类似于vue中的mutation&#xff0c;只能做同步操作&#xff0c;异步的话不用actions来实现。由于在项目始终不可避免要实现的异步数据的更新&#xff0c;这明显不够用了。是时候引入我们的异步中间件redux-thun…

计算机组成原理笔记9(指令系统,立即寻址,直接寻址,间接寻址.....)

指令操作码 操作码的位数决定了不同功能指令的多少&#xff0c;位数越多&#xff0c;所能表示的操作功能就越丰富。指令的操作码通常有两种编码格式&#xff1a; 定长操作码 定长操作码对于简化硬件设计&#xff0c;减少指令译码时间非常有利&#xff0c;例如IBM370指令系统&a…

Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用&#xff0c;森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数&#xff0c;造成重大的损失。如果有一款监测软件&#xff0c;从硬件处获得的图像中监测是否有火焰&#xff0c;从而报警&#xff0…

uv: 一个统一的Python包管理工具

uv是由Astral公司开发的一个极其快速的Python包管理器,完全用Rust编写。它最初在2月份发布,作为pip工作流的替代品。现在,uv已经扩展成为一个端到端的解决方案,可以管理Python项目、命令行工具、单文件脚本,甚至Python本身。可以说,uv就像是Python界的Cargo:一个快速、可靠、易…

XQT_UI 组件|03 |加载组件 XQtLoading

XQtLoading 使用文档 简介 XQtLoading 是一个自定义的加载动画组件&#xff0c;旨在为用户提供可配置的旋转花瓣动画效果。它可以在应用程序中用于指示加载状态&#xff0c;提升用户体验。 特征 可配置性&#xff1a;用户可以根据需求调整旋转周期、缩放周期、最大/最小缩放…

置换环模板题E - Permute K times 2

输入样本 1 6 3 5 6 3 1 2 4样本输出 1 6 1 3 2 4 5每次操作后&#xff0c; P P P 都会发生如下变化&#xff1a; 第一次操作后&#xff0c; P P P 为 ( 2 , 4 , 3 , 5 , 6 , 1 ) (2,4,3,5,6,1) (2,4,3,5,6,1) 。第二次操作后&#xff0c; P P P 为 ( 4 , 5 , 3 , 6 , …

溪源飨提高免疫力治未病:硒+辅酶Q10强力组合

上周我和女友在亲友的见证下举行了庄重的订婚仪式。我和女友是经朋友介绍才认识的&#xff0c;认识时间并不算长。第一次见面&#xff0c;彼此就被对方深深地吸引了&#xff0c;真可谓一见钟情。我喜欢她那恬静的美&#xff0c;难以忘怀她那散发着迷人气息的双眸&#xff1b;她…

CMakeLists.txt 编写规则

目录 1. 注释 1.1 注释行 1.2 注释块 2. CMakeLists.txt的编写 2.1 同意目录下的源文件 2.2 SET指令 2.3 file和aux_source_directory 2.4 包含头文件 2.5 生成动态库和静态库 2.6 链接库文件 2.7 message指令 2.8 移除操作 2.9 find_library和find_package 3. 常…

【瑞吉外卖】-day01

目录 前言 第一天项目启动 获取资料 创建项目 ​编辑 连接本地数据库 连接数据库 修改用户名和密码 ​编辑创建表 创建启动类来进行测试 导入前端页面 创建项目所需目录 检查登录功能 登录界面 登录成功 登录失败 代码 退出功能 易错点 前言 尝试一下企业级项…

部署DNS主从服务器

一。DNS主从服务器作用&#xff1a; DNS作为重要的互联网基础设施服务&#xff0c;保证DNS域名解析服务的正常运转至关重要&#xff0c;只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中&#xff0c;从服务器可以从主服务器上获取指定的区域数据文件&…

基于Multisim的单双声道音频功率放大电路设计与仿真

1.额定输出功率≥5W&#xff08;fi1KHz,Ui100mV&#xff09; 2.频率响应范围150Hz&#xff5e;13KHz 3.高、低音频端提升或衰减3dB 链接&#xff1a;https://pan.baidu.com/s/1exsBJoXdkb-gPr1IkxNvDg 提取码&#xff1a;jh5j

技术分享 | 大语言模型增强灰盒模糊测试技术探索

大语言模型凭借其庞大的参数规模&#xff0c;能够通过无监督学习从海量文本中获取知识&#xff0c;从而不仅能够深刻理解文本语义&#xff0c;还能准确识别文本的格式和结构。凭借对不同数据结构的深度理解&#xff0c;大语言模型已在众多领域得到广泛应用。其中&#xff0c;尤…

【Vue3】第三篇

Vue3学习第三篇 01. 组件组成02. 组件嵌套关系03. 组件注册方式04. 组件传递数据Props05. 组件传递多种数据类型06. 组件传递Props校验07. 组件事件08. 组件事件配合v-model使用09. 组件数据传递10. 透传Attributes 01. 组件组成 在vue当中&#xff0c;组件是最重要的知识&…

移动开发(五):.NET MAUI中自定义主题设置

目录 一、.NET MAUI主题设置原理 二、.NET MAUI主题设置案例 2.1 创建主题文件 2.2 修改App.xaml 文件 2.3 设置默认主题的三种方式 2.4 通过按钮切换主题 三、.NET MAUI主题设置技巧 四、总结 今天给大家分享.NET MAUI应用中如何自定义主题&#xff0c;提升APP本身个性…