代码随想录| 图论04 查并集 ●查并集理论知识 ●1971.寻找图中是否存在路径 ●684.冗余连接 ●685.冗余连接II

news2024/10/5 18:08:10

#查并集理论知识

 

并查集用处:解决连通性问题

  • 将两个元素添加到一个集合中。
  • 判断两个元素在不在同一个集合

思路:将三个元素A,B,C (分别是数字)放在同一个集合,其实就是将三个元素连通在一起,如何连通:只需要用一个一维数组来表示,即:father[A] = B,father[B] = C 这样就表述 A 与 B 与 C连通了(有向连通图)。如果几个元素的根是同一个,代表在同一集合。

find的路径压缩:

就需要 路径压缩,将非根节点的所有节点直接指向根节点

路径压缩长一点写:

int find(int u) {
    if (u == father[u]) return u;
    else return father[u] = find(father[u]); // 路径压缩
}

 路径压缩短一点写:

int find(int u) {
    return u == father[u] ? u : father[u] = find(father[u]);
}

 随想录的查并集模板:

int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好
vector<int> father = vector<int> (n, 0); // C++里的一种数组结构

// 并查集初始化
void init() {
    for (int i = 0; i < n; ++i) {
        father[i] = i;
    }
}
// 并查集里寻根的过程
int find(int u) {
    return u == father[u] ? u : father[u] = find(father[u]); // 路径压缩
}

// 判断 u 和 v是否找到同一个根
bool isSame(int u, int v) {
    u = find(u);
    v = find(v);
    return u == v;
}

// 将v->u 这条边加入并查集
void join(int u, int v) {
    u = find(u); // 寻找u的根
    v = find(v); // 寻找v的根
    if (u == v) return ; // 如果发现根相同,则说明在一个集合,不用两个节点相连直接返回
    father[v] = u;
}

# 1971.寻找图中是否存在路径  并查集基础题目

我用dfs做的,自己处理edge信息,梦回3343 3391了

void dfs(int start, int dest, vector<vector<int>>& edges, vector<vector<int>> &path, vector<bool> &v,bool &flag){
        if(start==dest){
            flag=true;
            return;
        }
        v[start]=true;
        for(int i=0;i<path[start].size();i++){
            if(!v[path[start][i]]) dfs(path[start][i], dest,edges,path,v,flag);
        }
    }


    bool validPath(int n, vector<vector<int>>& edges, int source, int dest) {
        vector<vector<int>> path(n);
        vector<bool> v(n,false);
        bool flag=false;

        for(int i=0;i<edges.size();i++){
            //edges[i] = [ui, vi]   edges[i][0] edges[i][1]
            path[edges[i][0]].push_back(edges[i][1]);
            path[edges[i][1]].push_back(edges[i][0]);
        }

        dfs(source,dest,edges,path,v,flag);
        return flag;
        
    }

查并集做法:(要把模板学会记住)自己写的:

    int n=200001;
    vector<int> father=vector<int> (n,0);

    void init(){
        for(int u=0;u<n;u++) father[u]=u;
    }

    int find(int u){
        if(u==father[u]) return u;
        return father[u]=find(father[u]);
    }

    bool isSame(int u, int v){
        u=find(u);
        v=find(v);
        return u==v;
    }

    void join(int u, int v){
        u=find(u);
        v=find(v);
        if(u!=v) father[u]=v;
    }

    bool validPath(int n, vector<vector<int>>& edges, int source, int dest) {
  
        init();
        for(int i=0;i<edges.size();i++){
            join(edges[i][0],edges[i][1]);
        }
        return isSame(source,dest);
    }

记住,所有函数最外面这么写会错:

int n=200001;

vector<int> father(n,0); 

但是vector<int> father = vector<int>(n,0);  这样写就可以(我不知道为什么

因为:在C++中,同一个编译单元(通常就是一个源文件)内的全局变量的初始化顺序是不确定的。编译器可能以任何顺序初始化它们,这个顺序通常取决于编译器的实现,是不可预测的。


#684.冗余连接 

我没想到思路

判断成环:已经有同样的根,但是又来一个edge连接两者。

join易错点:最后一步 father[u]=v, father[v]=u 都可以,但是被赋值的一定要是father,不能反

int n=1001;
    vector<int> father=vector<int>(n,0);

    void init(){
        for(int u=0;u<n;u++) father[u]=u;
    }

    int find(int u){
        if(u==father[u]) return u;
        return father[u]=find(father[u]);
    }

    void join(int u, int v){
        u=find(u);
        v=find(v);
        
        if(u!=v) father[v]=u;
    }

    bool isSame(int u, int v){
        u=find(u);
        v=find(v);
        return u==v;
    }

    vector<int> findRedundantConnection(vector<vector<int>>& edges) {
        init();
        for(int i=0;i<edges.size();i++){
            if(isSame(edges[i][0],edges[i][1])) return edges[i];
            join(edges[i][0],edges[i][1]);
             
        }
        return {};
    }

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

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

相关文章

【Kubernetes资源篇】ingress-nginx最佳实践详解

文章目录 一、Ingress Controller理论知识1、Ingress Controller、Ingress简介2、四层代理与七层代理的区别3、Ingress Controller中封装Nginx&#xff0c;为什么不直接用Nginx呢&#xff1f;4、Ingress Controller代理K8S内部Pod流程 二、实践&#xff1a;部署Ingress Control…

Raki的读paper小记:LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

Abstract&Introduction&Related Work 研究任务 对大模型进行部分微调 已有方法和相关工作 现有技术通常通过扩展模型深度引入推理延迟&#xff08;Houlsby 等人&#xff0c;2019&#xff1b;Rebuffi 等人&#xff0c;2017&#xff09;&#xff0c;或通过减少模型可用序…

Python实现HBA混合蝙蝠智能算法优化卷积神经网络回归模型(CNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法&#xff0c;是一种搜索全局最优解的有效方法…

集成了32位Cortex®M0内核XMC1302T038X0200AB、XMC1302Q040X0200AB 32MHz 200KB 闪存 工业MCU

XMC1000 32位工业 MCU 将 ARM Cortex™-M0 核心与领先的 65nm 制造工艺相结合&#xff0c;克服了目前 8 位设计的局限。XMC1000系列让目前的 8 位用户有机会享受 32 位的功耗&#xff0c;同时不在价格或易用性上做出妥协。XMC1000 在其细分市场提供最为广泛的闪存产品线&#x…

人工智能相关笔记

这近一年来&#xff0c;我在国科大修了&#xff1a;人工智能导论、机器学习与模式识别、语义网络与知识图谱、深度学习、强化学习……这几门专业课&#xff0c;由于发现了它们彼此之间有重复的知识点&#xff0c;真想把他们融会贯通一下&#xff0c;至少写个提纲挈领的东西给自…

xcode15启动IOS远程调试

1.用数据线连接IPhone到macOS 2.打开xcode15,然后点击Window->Devices and Simulators 3.选中左边的Devices可看到已连接的IPhone,然后点击Connect via network使其选中. 选择后,左边的IPhone设备的右边出现一个地球图标,表示成功通过网络连接到IPhone 现在可断开数据线的…

K8S初级入门系列之八-网络

一、前言 本章节我们将了解K8S的相关网络概念&#xff0c;包括K8S的网络通讯原理&#xff0c;以及Service以及相关的概念&#xff0c;包括Endpoint&#xff0c;EndpointSlice&#xff0c;Headless service&#xff0c;Ingress等。 二、网络通讯原理和实现 同一K8S集群&…

大模型开发(十):Chat Completion Models API 详解

全文共8000余字&#xff0c;预计阅读时间约18~28分钟 | 满满干货(附代码案例)&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;详解Chat Completion Models的参数及应用实例&#xff0c;并基于该API实现一个本地知识库的多轮对话智能助理 代码&文件下载点这里 一、…

通过ETL自动化同步飞书数据到本地数仓

一、飞书数据同步到数据库需求 使用飞书的企业都有将飞书的数据自动同步到本地数据库、数仓以及其他业务系统表的需求&#xff0c;主要是为了实现飞书的数据与业务系统进行流程拉通或数据分析时使用&#xff0c;以下是一些具体的同步场景示例&#xff1a; 组织架构同步&#…

windows版docker部署mysql并导入数据

会用到的操作命令&#xff1a; 1.退出容器中的bash界面&#xff1a;exit 2.停止某个容器&#xff1a;docker stop container_name_or_id 3.要强制删除 Docker 中的某个容器&#xff1a; docker rm -f container_name_or_id 1.先下载并配置好docker 2.拉取 MySQL 镜像&#x…

深度学习——过拟合和Dropout

基本概念 什么是过拟合&#xff1f; 过拟合&#xff08;Overfitting&#xff09;是机器学习和深度学习中常见的问题之一&#xff0c;它指的是模型在训练数据上表现得很好&#xff0c;但在未见过的新数据上表现较差的现象。 当一个模型过度地学习了训练数据的细节和噪声&#…

数据仓库发展历史

数据仓库发展历史 一、演变 数据仓库是企业中用于存储、整合和分析数据的关键组件。随着时间的推移&#xff0c;数据仓库经历了三代演化&#xff1a;从需求驱动到平台化、从平台化到智能&#xff08;AI&#xff09;化 二、第一代&#xff08;过时&#xff09; 第一代数据仓…

【《Spring Boot微服务实战(第2版)》——一本关于如何在Spring Boot中构建微服务的全面指南】

使用Spring Boot框架构建基于Java的微服务架构&#xff0c;将应用程序从小型单体架构蜕变为由多个服务组成的事件驱动架构。这个最新版本围绕服务发现、负载均衡、路由、集中式日志、按环境配置和容器化等知识点&#xff0c;循序渐进地讲述微服务架构、测试驱动的开发和分布式系…

Radare2:using test

Radare2:using test └─$ sudo apt install radare2 100 ⨯ [sudo] kwkl 的密码&#xff1a; 正在读取软件包列表... 完成…

【Bug记录篇】IDEA双击打不开,报错的问题

早上&#xff0c;带着满满的干劲来实验室&#xff0c;准备继续我的IDEA之旅&#xff0c;结果好嘛&#xff0c;一打开IDEA&#xff0c;给我这样&#xff1f;&#xff01;&#xff01;&#xff01;&#x1f632;&#x1f632;&#x1f632; 这是怎么回事&#xff01;&#xff01;…

FPGA-DFPGL22学习7-gpio

系列文章目录 FPGA-DFPGL22学习6-led 文章目录 系列文章目录前言一、原理图1&#xff09;key2&#xff09;beeptouch端口对应1)key2)beeptouch 二、程序设计1)KEY2)beeptouch 三、程序编写1.KEY代码&#xff1a;2.beeptouch代码&#xff1a; 结论 前言 和原子哥一起学习FPGA …

blender 基础材质篇

材质展示 材质背景介绍 什么是PBR&#xff1f; PBR 全称为 Physically Based Rendering&#xff0c;译为基于物理属性的引擎渲染&#xff0c;也就是说会把物质的颜色、粗糙度、高光属性等进行分别处理&#xff0c;使物质体现出更真实的感觉&#xff1b; 什么是BRDF&#xff…

【Linux】初识多线程深入理解进程地址空间

目录 1 多线程的引入 1.1 相关概念 1.2 Linux操作系统理解多线程 特殊的进程结构 创建子进程的过程 创建多线程 进程与线程之间的关系 1.3 对多线程结构的管理 Windows管理多线程 Linux管理多线程 1.4 理解多线程与多进程相比&#xff0c;调度的成本更低 2 深入理…

[JAVAee]volatile关键字

目录 1.volatile的特性 ①保持线程可见性 2.volatile注意事项及适用场景 ①注意事项 ②适用场景 1.volatile的特性 ①保持线程可见性 volatile,译为"易变的". 对此我们就可以这样理解,对于被volatile修饰的变量的数值,是容易变化的. 在之前的线程安全文章中,…

XILINX ZYNQ 7000 AXI总线 (二)

了解了AXI 的大部分内容后&#xff0c;开始做一个实战&#xff0c;就是完成AXI 结构的输入输出搭建。 一.创建一个IP 3. 4. 5. 6.选择AXI FULL&#xff0c;创界主接口和从接口 7. 8.可以看到XILINX AXI FULL 的源代码 二.创建一个新的工程&#xff0c;把IP导入到这个工…