【Leetcode & Union-Find】使用并查集解决1319. Number of Operations to Make Network Connected

Leetcode 1319:连通网络的操作次数(超详细的解法!!!) 用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。 网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。 给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计... 阅读详情

写在前面

这是今天下午做leetcode contest的第三题,一开始看到的时候以为考察的是图的连通性的问题,没能想出解决方法,后来看Discussion,发现大家都用到了Union-Find,正好《算法》也看到Union-Find,于是就去把这章看完了再来做,下面会先介绍Union-Find,然后写解题思路。

Union-Find(并查集)

由Dynamic Connectivity Problem引出。

问题Context:

有N个node(0, ……, N - 1),(p, q) pair指node p和node q连通(connection),这个连通关系是一个等价关系(自反性、对称性、传递性)。互相之间有通路的节点可以认为是在同一个component中(个人觉得这里也可以说在一个集合中)。

算法可以做到:
  1. 连通(connect / union)两个节点
    两个节点原本处在不同的component中,若将两个节点连通,则两个component也合并为一个(做并操作)
  2. 找到node p所在的component(一般是用该component中某个node的id来指代这个component)
  3. 判断两个node是否连通
  4. 获得component的个数
API
public void union(int p, int q);
public int find(int p);
public boolean connected(int p, int q);
public int count();
使用的数据结构

最关键的是记录每一个节点情况的数组
int[] id = new int[N];

两种实现方式

这里只简单记录,《算法》书中有详细分析

Fast-Find

id数组记录的直接是每个node所在的component的identifier,union时,将两个node的identifier设为一致

public int find(int p) {
	return id[p];
}

public void union(int p, int q) {
	int pID = find(p);
	int qID = find(q);
	
	if (pID == qID)
		return;
	for (int i = 0; i < id.length; i++){
		if (id[i] = pID) {
			id[i] = qID;
		}
	}
	count--;	//the number of components, which is initialized as N
}
Fast-Union

这是我在解题时使用的实现
id数组传达的信息更复杂一些,node p对应的id[p]记录的是node p所在的component中的下一个node是什么,结束node记录的id[node] == node(类似于形成一个链表,每个node只有一个域,指向下一个node)

public int find(int p) {
	while (p != id[p])
		p = id[p];	//refer to the next node
	//get the root
	return p;
}

public void union(int p, int q) {
	int pRoot = find(p);
	int qRoot = find(q);
	//decide whether the two nodes are in the same component
	if (pRoot == qRoot)
		return;
	id[p] = q;	//let p point to q
	count--;
}

在上述实现中,总是将node q加入到p的component中,对此有更好的实现方法,即将权重小的树(即节点更少的component)加入到权重大的树中,但这需要额外的数据结构来保存weight,具体可以参考书本

Union-Find衍生实际问题:
  1. 网络中设备的连通
  2. (不同名的)变量等价
  3. 数学集合(个人觉得这是并查集的本质)



\以下是leetcode题目

原题链接

题目描述

There are n computers numbered from 0 to n-1 connected by ethernet cables connections forming a network where connections[i] = [a, b] represents a connection between computers a and b. Any computer can reach any other computer directly or indirectly through the network.
Given an initial computer network connections. You can extract certain cables between two directly connected computers, and place them between any pair of disconnected computers to make them directly connected. Return the minimum number of times you need to do this in order to make all the computers connected. If it’s not possible, return -1.

给定电脑数量和连通情况,判断要移动几根连通线才能使所有电脑连通

解题思路

根据连通情况将computer连通,并得到最后形成的component数量,要增加的连通线数量就是将原本不连通的component连通起来,因此最少为(count - 1),注意存在多余的连通线不够用的情况

class Solution {
    public int makeConnected(int n, int[][] connections) {
        //union-find
        int[] site = new int[n];
        int component = n, redundance = 0;
        
        
        for (int i = 0; i < n; i++) {
            site[i] = i;
        }
        
        for (int i = 0; i < connections.length; i++) {
            int tmp = connect(connections[i][0], connections[i][1], site);
            if (tmp == 1)
                component--;
            else
                redundance++;
        }
        
        //not enough
        int res = component - 1;
        if (res > redundance)
            return -1;
        return res;
        
    }
    
    private int find(int p, int[] site) {
        while (p != site[p]) {
            p = site[p];
        }
        return p;
    }
    
    private int connect(int p, int q, int[] site) {
        int pRoot = find(p, site);
        int qRoot = find(q, site);
        
        if (pRoot != qRoot) {
            site[pRoot] = qRoot;
            return 1;
        }
        return -1;
    }
}
【Leetcode Hard】1349. Maximum Students Taking Exam 原题链接 题目描述 给你一个 m * n 的矩阵 seats 表示教室中的座位分布。如果座位是坏的(不可用),就用 ‘#’ 表示;否则,用 ‘.’ 表示。 学生可以看到左侧、右侧、左上、右上这四个方向上紧邻他的学生的答卷,但是看不到直接坐在他前面或者后面的学生的答卷。请你计算并返回该考场可以容纳的一起参加考试且无法作弊的最大学生人数。 学生必须坐在状况良好的座位上。 输入:seats = [[... 阅读详情

相关推荐

SAP中成本估算没有找到工艺路线消息处理实例

在针对成品的标准成本核算处理过程中,系统中会经由设定好的策略来收集成品相关成本组成,最终计算出产成品的标准成本。关于成本组成,可以归纳为三个基本要素,料,工,费。即标准成本就是要知道,生产一件成品,需要消耗多少钱的原材料?消耗多少钱的人工?以及其它的间接消耗? 某日,接到CO同事的反馈,在用CK11N做产成品标准价格核算时,提示没有工艺路线确定,但该消息为绿灯,可以通过。基于业务上的谨慎,提出分析。 从提示可以看出问题与工艺路线有关。因为,成品工艺路线中设定有成品生产所耗工时,所以,在计算产成品标准

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 6279

Leetcode1319. 连通网络的操作次数(medium,BFS,DFS)

Leetcode1319. 连通网络的操作次数(medium,BFS,DFS),Python题解

chenxy_bwave的专栏 1112

STM32 Nucleo-144开发板开箱bring-up

最近做项目,用到STM32F446ZET6这款MCU,为了赶进度,前期软件需要提前开发,于是在某宝买了对应主控的官方开发板,为了避免遗忘,后面能翻出来回忆一些细节,就形成了本篇的主要内容,同时也希望能够帮助刚上手的小伙伴少走弯路,如果对你有帮助请点赞、收藏、转发,谢谢!

汽车电子软件领域知识分享 2679

leetcode 1319. 连通网络的操作次数(C++)

用以太网线缆将n台计算机连接成一个网络,计算机的编号从0到n-1。线缆用connections表示,其中connections[i] = [a, b]连接了计算机a和b。 网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。 给你这个计算机网络的初始布线connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连...

qq_27060423的博客 841

【Matlab 六自由度机器人】基于改进型D-H参数的运动学建模与蒙特卡洛工作空间分析

本文详细介绍了如何使用改进型D-H参数法为六自由度机器人建立运动学模型,并利用Matlab Robotics Toolbox实现正运动学计算与可视化。通过蒙特卡洛法对机器人工作空间进行分析,生成三维点云图以直观展示其可达范围,为机器人选型与任务规划提供关键依据。

weixin_29040367的博客 439

Win11 C盘爆满别慌!手把手教你安全迁移AppData和用户文件夹(附一键脚本)

本文针对Win11 C盘空间不足问题,提供了一套安全有效的解决方案。通过深入解析用户目录结构,指导用户利用符号链接和Robocopy工具,将AppData、下载文档等占用大户迁移至其他分区,并附带了自动化脚本,从根本上实现C盘瘦身,同时确保系统稳定和数据安全。

weixin_29231221的博客 2090

LeetCode-1319. Number of Operations to Make Network Connected

There arencomputers numbered from0ton-1connected byethernet cablesconnectionsforming a network whereconnections[i] = [a, b]represents a connection between computersaandb. Any computerca...

reigns的博客 775

PHP与Node.js的对比及优缺点分析

PHP和Node.js是两种常用的服务器端编程语言,它们在不同的应用场景下各有优势和劣势。本文将全方位比较PHP和Node.js的特点,以及它们在编程中的优缺点,并提供相应的源代码示例供参考。需要注意的是,本文只是对PHP和Node.js的一些优缺点进行了简要介绍,实际应用中还需要考虑其他因素,如团队经验、项目规模和预算等。最终的选择应该基于全面的评估和需求分析。PHP:PHP是一种同步阻塞的编程语言,它的处理方式是一次只处理一个请求。Node.js:Node.js的性能较高,特别适合处理高并发的请求。

ByteSparkX的博客 888

Leetcode 1319.连通网络的操作次数(Number of Operations to Make Network Connected)

Leetcode 1319.连通网络的操作次数 1 题目描述(Leetcode题目链接)   用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。 网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。 给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返

qq_39378221的博客 451

02 HCM CPI SF集成-组织集成(一)

将员工主数据和组织数据从SAP Successfactors Employee CentraI复制到SAPERP或SAP S/4HANA,SAP SF CPI HCM集成

SAP CPI 130

解决MiGPT部署痛点:小米账号异地登录安全验证的解决方案

为让小米音箱更智能🤖,部署MiGPT时遇到小米账号异地登录验证问题,手动验证后仍无法解决。本文分享亲测有效的简化方案✨:通过浏览器F12获取passToken📝,手动创建mi.json配置文件并挂载到Docker容器,无需本地运行MiGPT,直接绕过异地验证,附完整操作步骤和问题排查指南。

XiaoqiangClub的博客 1450

LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)

文章目录1. 题目2. 解题2.1 BFS2.2 DFS2.3 并查集 1. 题目 用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。 线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。 网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。 给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。 请你计算并返回使所

Michael是个半路程序员 2248

B07:AI 时代怎么考核团队?我把 KPI 改了 5 版才找到答案

最后说一句掏心窝的话。绩效考核不是"管人"的工具,是"引导团队行为"的工具。你定什么指标,团队就会做什么行为。你定"AI 占比",团队就凑占比你定"效率提升",团队就挑软柿子你定"代码行数",团队就刷行数你定"工具使用率",团队就刷使用只有定"业务价值 + 工程质量 + 能力成长"三个维度的指标,团队才会真正关注长期价值。这套 KPI,我在我带的团队里跑了 6 个月,没有任何一个指标被"刷"出来。考核的是结果,不是过程。永远考核"创造了多少价值",永远不考核"用了多少 AI"。

刘一说的IT专栏 503

Leetcode 1319. Number of Operations to Make Network Connected - 彻底掌握并查集(Union Find)系列题12

题目又多处出现关键词connected,可以确定是连通性问题,马上想到并查集(Union Find)。这道题的问法跟之前的并查集题稍有不同,但是万变不离其宗,仍然可以套用并查集(Union Find)模板。

hgq522的博客 414

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LeetCode C++ 1319. Number of Operations to Make Network Connected【BFS/DFS/Union Find】中等

There are&nbsp;n&nbsp;computers numbered from&nbsp;0&nbsp;to&nbsp;n-1&nbsp;connected by&nbsp;ethernet cables&nbsp;connections&nbsp;forming a network where&nbsp;connections[i] = [a, b]&nbsp;represents a connection between computers&nbsp;a&nbsp;and&nbsp;b. A

memcpy0的博客 459

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

leetcode 1319. Number of Operations to Make Network Connected 连通网络的操作次数

Problem:并查集,得到not connected树的棵树 kk,那么最少需要kk-1个边来connect这些树,若connections.size() < kk-1则返回-1。

邹九的个人博客 68

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

leetcode 1319. Number of Operations to Make Network Connected(使网络连接的操作数)

union-find算法

蓝羽飞鸟的博客 256

leetcode —— 1319. 连通网络的操作次数

用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。 网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。 给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计...

然后就去远行 560

leetcode:1319. 连通网络的操作次数(dfs)

链接:https://leetcode-cn.com/problems/number-of-operations-to-make-network-connected/ 用数组记录下连通关系(注意是双向的),然后用dfs检查共有几个连通图,答案即为连通图的数量减1. C++代码: class Solution { vector&lt;vector&lt;int&gt;&gt; edges; vector&lt;bool&gt; used; public: int makeConnect

Gomamon的博客 241

1319. Number of Operations to Make Network Connected(并查集)

package Union_Find; public class MakeConnected_1319 { // 1319. Number of Operations to Make Network Connected int[] P; // 剩余的线 int count; public int makeConnected(int n, int[][] connections) {...

私念的博客 296

力扣 leetcode 1319. 连通网络的操作次数 (python)并查集模板快速解及树的高效解

Topic: 用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。 网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。 给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1 。 Exa

weixin_50791900的博客 390

LeetCode:1319题——连通网络的操作数

题目: 用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。 网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。 给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1 。 来源:力扣(Le

qq_44630682的博客 368

leetcode1319

连通网络的操作次数 文章目录连通网络的操作次数前言一、关于c++中二维数组的传参二、使用步骤1.引入库2.读入数据总结 前言 放假不久,在家打码,不过明天就能打球了,耶/font&gt; 一、关于c++中二维数组的传参 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt impor

qq_29822911的博客 225

leetcode 1319 连通网络的操作次数

leetcode 1319 连通网络的操作次数; 并查集,记录集合个数;

大草的博客 497

leetcode-dfs总结

一:二分图:颜色分图 1:leetcode:785https://leetcode-cn.com/problems/is-graph-bipartite/ 思想:即然要分成两组,二分,即颜色不同,把一天边的两个结点分成A,B两个集合,则考虑用一个颜色(eg:蓝色)赋予当 前结点,把与它相邻的结点赋予另一颜色(...

LLM1602的博客 1405

1319. Number of Operations to Make Network Connected

There arencomputers numbered from0ton-1connected byethernet cablesconnectionsforming a network whereconnections[i] = [a, b]represents a connection between computersaandb. Any computerca...

Do not mess it up 426
上一篇: 【Leetcode Medium】1318. Minimum Flips to Make a OR b Equal to c
下一篇: 【Leetcode Easy】1346. Check If N and Its Double Exist
JellyFishDing
博客等级 码龄8年 4粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值