leetcode:1579. 保证图可完全遍历【并查集思路】

news2024/11/24 5:28:18

目录

  • 题目截图
  • 题目分析
  • ac code
  • 总结

题目截图

在这里插入图片描述

题目分析

  • 从删除比较难,考虑增加
  • 增加的过程中无用的边就可以删除
  • 考虑alice和bob各自的联通分量
  • 最后希望都是1,一开始都是n
  • 如果将两个独立的联通分量连起来了,那么连通分量个数减1
  • 这里很明显就是用并查集了
  • 公共边的贡献最大,先考虑;独立的边后考虑
  • alice和bob各自维护一个并查集
  • 如果当前的边确实可以达到合并两个联通分量的目的,加进来;否则ans += 1
  • 最后看a和b维护的并查集的连通分量个数是否都是1即可
  • 需要在并查集的merge中判断xy是否已经同属一个联通分量,返回True或者False

ac code

class UnionFind:
    def __init__(self, n):
        self.parent = list(range(n))
        self.cnt = n # 连通块个数
 
    def find(self, a):
        acopy = a
        while a != self.parent[a]:
            a = self.parent[a]
        while acopy != a:
            self.parent[acopy], acopy = a, self.parent[acopy]
        return a
 
    def merge(self, a, b):
        # 这是一个无用的合并
        if self.find(b) == self.find(a):
            return False
        # 这是一个有用的合并
        self.parent[self.find(b)] = self.find(a)
        self.cnt -= 1
        return True

class Solution:
    def maxNumEdgesToRemove(self, n: int, edges: List[List[int]]) -> int:
        # edges预处理为[0, n - 1]
        for i in range(len(edges)):
            edges[i][1] -= 1
            edges[i][2] -= 1

        # 加入两个并查集
        ufa, ufb = UnionFind(n), UnionFind(n)
        # 记录删除无用边的总个数
        ans = 0 
        # 先看公共边
        for t, u, v in edges:
            if t == 3:
                flag1 = ufa.merge(u, v)
                flag2 = ufb.merge(u, v)
                # 都没有用才不要这个公共边
                # 否则它的贡献至少是独有边
                if not flag1 and not flag2:
                    ans += 1
                else:
                    pass
        # 再看单独边
        for t, u, v in edges:
            if t == 1:
                if not ufa.merge(u, v):
                    ans += 1
            elif t == 2:
                if not ufb.merge(u, v):
                    ans += 1
        
        #print(ufa.parent)
        #print(ufb.parent)
        if ufa.cnt != 1 or ufb.cnt != 1:
            return -1
        return ans

总结

  • 由删除变成增加
  • 并查集模板修改,联通分量统计
  • 边的优先级

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

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

相关文章

kubernetes-Pod详解2

kubernetes-Pod详解2 文章目录kubernetes-Pod详解2Pod生命周期创建和终止pod的创建过程pod的终止过程初始化容器钩子函数容器探测方式一:Exec方式二:TCPSocket方式三:HTTPGet重启策略Pod调度定向调度NodeSelector亲和性调度NodeAffinityPodAf…

Kamiya丨Kamiya艾美捷AREG酶联免疫吸附试验原理

Kamiya艾美捷AREG酶联免疫吸附试验预期用途: 该试剂盒是一种用于体外定量测量大鼠AREG的夹心酶免疫测定法血清、血浆和其他生物流体。仅供研究使用。不用于诊断程序。 存储: 所有试剂应按照小瓶上的标签保存。校准器、检测试剂A、检测试剂B和96孔带板应…

ZMQ之高可靠对称节点--双子星模式

一、概览 双子星模式是一对具有主从机制的高可靠节点。任一时间,某个节点会充当主机,接收所有客户端的请求;另一个则作为一种备机存在。两个节点会互相监控对方,当主机从网络中消失时,备机会替代主机的位置。 双子星模…

gateway网关聚合knife4j文档,同时兼容swagger2与swagger3

基于前两篇文章,进行整合 springcloud-gateway 聚合swagger3请求接口丢失appliactionName解决 springcloud-gateway聚合knife4j接口文档 为何要兼容?微服务开发者有的使用了swagger2版本,有的使用了swagger3版本,但暴露外部给前…

聊一聊我的第一个开源项目

项目地址:https://github.com/kpretty/hdd 我在21年的国庆写过一篇文章:《Docker 实战:部署hadoop集群》,当时也是刚接触docker,作为docker第一个练手项目对很多概念理解的不是很到位,因此那篇文章所使用的…

基于PHP+MySQL菜品食谱美食网站的设计与实现

美食是人类永恒的追求,现在有很多的美食爱好者,他们希望通过自己的各种方式来学习更多的美食制作方式,以及分享自己制作美食的一些过程,说让更多的人。享受到更加美味可口的饭菜。本系统也是基于这样的目的来进行开发的。 本系统是通过PHP:MySQL来进行开发,主要实现…

存储器扩展,画图题

目录 存储器与CPU的接口 地址线的连接 数据线的连接 控制线的连接(读写和片选) 考题 引出 第一题 第二题 第三题 计算地址范围(这里用的38译码器) 第四题 填空题 第五题 第六题(2017) 要求&…

【微信小程序】CSS模块化、使用缓存在本地模拟服务器数据库

🏆今日学习目标:第十五期——CSS模块化、使用缓存在本地模拟服务器数据库 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰预计时间:25分钟 🎉专栏系列:我的第一个微信小程序 文…

【这款神器可以有】3DMAX一键墙体门洞窗洞插件使用教程

3DMAX一键墙体门洞窗洞插件,只需导入户型图,单/双面墙体一键生成。 【主要功能】 --一键生成墙体 --一键门洞 --一键窗洞 --支持单/双面墙体生成 【安装方法】 无需安装,直接拖动插件脚本到3dmax窗口即可打开插件。 【快速开始】 将3dm…

11.我为 Netty 贡献源码 | 且看 Netty 如何应对 TCP 连接的正常关闭,异常关闭,半关闭场景

我为 Netty 贡献源码 | 且看 Netty 如何应对 TCP 连接的正常关闭,异常关闭,半关闭场景 本系列Netty源码解析文章基于 4.1.56.Final版本 写在前面..... 本文是笔者肉眼盯 Bug 系列的第三弹,前两弹分别是: 抓到Netty一个Bug,顺带来…

【Spring(七)】带你手写一个Spring容器

有关Spring的所有文章都收录于我的专栏:👉Spring👈 目录 前置准备 第一步、创建我们自定的注解 第二步、创建我们自己的容器类 测试 总结 相关文章 【Spring(一)】如何获取对象(Bean)【Spring&a…

CSS伪类使用详解

基本描述 CSS伪类是很常用的功能,主要应用于选择器的关键字,用来改变被选择元素的特殊状态下的样式。 伪类类似于普通CSS类的用法,是对CSS选择器的一种扩展,增强选择器的功能。 目前可用的伪类有大概40多个,少部分有兼…

Spring Bean的生命周期理解

一、Spring Bean的生命周期大的概括起来有四个阶段: 1、实例化 2、属性填充注入 3、初始化使用 4、Bean的销毁 二、如流程图所示 三、步骤说明 1、实例化 实例化一个Bean,即new 2、IOC依赖注入 按照Spring上下文对实例化的Bean进行属性填充注入 3、setB…

昆船智能上市:预计年营收19亿到22.5亿 市值48亿

雷递网 雷建平 11月30日昆船智能技术股份有限公司(简称:“昆船智能”,证券代码:301311)今日在深交所创业板上市。昆船智能本次发行股票6000万股,发行价为13.88元,募资8.33亿元。昆船智能开盘价为…

2022CTF培训(七)逆向专项练习

附件下载链接 babyre 首先是一个迷宫&#xff0c;由于答案不唯一&#xff0c;因此到 dfs 求出所有路径。 #include <bits/stdc.h>constexpr char s[] "**************.****.**s..*..******.****.***********..***..**..#*..***..***.********************.**..*…

springMVC01,springMVC的执行流程【第一个springMVC例子(XML配置版本):HelloWorld】

springMVC01,springMVC的执行流程【第一个springMVC项目&#xff1a;HelloWorld】springMVC的简介springMVC的执行流程第一个springMVC项目&#xff08;XML配置版本&#xff09;1.创建项目1.1 新建maven项目&#xff1a;1.2 添加web支持1.3 在pom.xml中导入依赖1.4 配置tomcat2…

【云享·人物】华为云AI高级专家白小龙:AI如何释放应用生产力,向AI工程化前行?

摘要&#xff1a;AI技术发展&#xff0c;正由应用落地阶段向效率化生产阶段演进&#xff0c;AI工程化能力将会不断深入业务&#xff0c;释放企业生产力。本文分享自华为云社区《【云享人物】华为云AI高级专家白小龙&#xff1a;AI如何释放应用生产力&#xff0c;向AI工程化前行…

[附源码]Python计算机毕业设计Django飞越青少儿兴趣培训机构管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

旅游景区地图导览系统,传统导览智慧新升级

地图在景区导览中一直扮演着重要角色。 从传统导览的纸质地图&#xff0c;再到智慧导览的电子地图&#xff0c;游客都可以从景区地图上了解到景点名称、游玩路线、服务设施等内容&#xff0c;帮助游客更好地游览景区。 相比传统的纸质地图导览&#xff0c;电子地图导览系统有哪…

计算机组成原理习题课第四章-4(唐朔飞)

计算机组成原理习题课第四章-4&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…