【數據結構-圖論】并查集

并查集(Union-Find)是一種數據結構,它提供了處理一些不交集的合并及查詢問題的高效方法。并查集主要支持兩種操作:

查找(Find):確定某個元素屬于哪個子集,這通常意味著找到該子集的“代表元素”或“根元素”。

合并(Union):將兩個子集合并成一個集合。

并查集通過數組或樹形結構來實現,其中每個節點指向其父節點,根節點指向自身,這樣形成一個或多個樹形結構。每棵樹代表一個集合,樹根的標識符(通常是數組的索引)代表整個集合的標識符。

基本概念:
初始化:開始時,每個元素各自構成一個單元素集合,即每個元素的父節點是其自身。
路徑壓縮:在執行查找操作時,將查找路徑上的每個節點直接連接到根節點,這樣可以加快后續查找的速度。
按秩合并:合并時,總是將更小的樹連接到更大的樹的根節點上,這可以幫助避免樹變得過深,從而保持操作的效率。

并查集的重要思想在于,用集合中的一個元素代表集合。
在這里插入圖片描述
現在1號和3號比武,假設1號贏了(這里具體誰贏暫時不重要),那么3號就認1號作幫主(合并1號和3號所在的集合,1號為代表元素)。
在這里插入圖片描述
現在2號想和3號比武(合并3號和2號所在的集合),但3號表示,別跟我打,讓我幫主來收拾你(合并代表元素)。不妨設這次又是1號贏了,那么2號也認1號做幫主。
在這里插入圖片描述
上面大概介紹完了整體的東西下面介紹一下細節:
在這里插入圖片描述
下面是代碼部分:

// 查找i的代表元素,并進行路徑壓縮優化
int find(int i) {if (fa[i] == i)  // 如果元素i指向自己,那么它是代表元素return i;elsereturn fa[i] = find(fa[i]);  // 否則遞歸查找,并更新i的父鏈接為代表元素
}// 合并i和j所在的集合
void unionn(int i, int j) {int i_fa = find(i);  // 查找i的代表元素int j_fa = find(j);  // 查找j的代表元素fa[i_fa] = j_fa;     // 將i的集合合并到j的集合中
}

find 函數通過遞歸查找找到一個元素的代表元素,并在查找的過程中將元素直接鏈接到代表元素,這個優化叫做路徑壓縮,它可以減少后續查找的時間。

unionn 函數將兩個元素所在的集合合并成一個集合。它首先找到每個元素的代表元素,然后將其中一個集合的代表元素鏈接到另一個集合的代表元素上,從而完成合并。這里沒有實現按秩合并或路徑壓縮的更復雜的優化。

下面是一道題
在這里插入圖片描述

public class UnionFind {private int[] parent;public UnionFind(int n) {parent = new int[n];for (int i = 0; i < n; i++) {parent[i] = i;}}public int find(int x) {if (x != parent[x]) {parent[x] = find(parent[x]);}return parent[x];}public void union(int x, int y) {parent[find(x)] = find(y);}public boolean isConnected(int x, int y) {return find(x) == find(y);}public static void main(String[] args) {UnionFind uf = new UnionFind(10);uf.union(0, 1); // Marry person 1 and 2uf.union(2, 3); // Marry person 3 and 4boolean areMarried = uf.isConnected(1, 4); // Check if person 2 and 5 are relatedSystem.out.println(areMarried ? "YES" : "NO"); // Output should be "NO" if unrelated}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712865.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712865.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue購物車實戰

1.引入vue <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> 2.設置高亮部分的樣式 <style> table tr{text-align: center;}.skyblue{background-color: skyblue;}</style> 3.設置body的基本樣式 <div id&q…

人大金倉與mysql的差異與替換

人大金倉中不能使用~下面的符號&#xff0c;字段中使用”&#xff0c;無法識別建表語句 創建表時語句中只定義字段名.字段類型.是否是否為空 Varchar類型改為varchar&#xff08;長度 char&#xff09; Int(0) 類型為int4 定義主鍵&#xff1a;CONSTRAINT 鍵名 主鍵類型&#x…

Found option without preceding group in config file 問題解決

方法就是用記事本打開 然后 左上角點擊 文件 有另存為 就可以選擇編碼格式

Linux設置程序任意位置執行(設置環境變量)

問題 直接編譯出來的可執行程序在執行時需要寫出完整路徑比較麻煩&#xff0c;設置環境變量可以實現在任意位置直接運行。 解決 1.打開.bashrc文件 vim ~/.bashrc 2.修改該文件&#xff08;實現將/home/zhangziheng/file/seqrequester/build/bin&#xff0c;路徑下的可執…

文件流【文件輸入流】

文件流&#xff1a;使用文件輸入流讀取文件中的數據&#xff1a; public class FISDemo {public static void main(String[] args) throws IOException {//將fos.dat文件中的字節讀取回來/*fos.dat文件中的數據:00000001 00000010*/FileInputStream fis new FileInputStream(…

第六節:Vben Admin權限-后端控制方式

系列文章目錄 第一節:Vben Admin介紹和初次運行 第二節:Vben Admin 登錄邏輯梳理和對接后端準備 第三節:Vben Admin登錄對接后端login接口 第四節:Vben Admin登錄對接后端getUserInfo接口 第五節:Vben Admin權限-前端控制方式 文章目錄 系列文章目錄前言一、角色權限(后端…

Java面試題總結6

Spring中有哪些設計模式 簡單工廠&#xff1a;由一個工廠類根據傳入的參數&#xff0c;動態決定應該創建哪一個產品類 工廠方法&#xff1a;實現FactoryBean接口的bean是一類叫做factory的bean 單例模式&#xff1a;保證一個類僅有一個實例&#xff0c;并提供一個訪問它的全…

【辦公類-18-03】(Python)中班米羅可兒證書批量生成打印(班級、姓名)

作品展示——米羅可兒證書打印幼兒姓名 背景需求 2024年3月1日&#xff0c;中4班孩子一起整理美術操作材料《米羅可兒》的操作本——將每一頁紙撕下來&#xff0c;分類擺放、確保紙張上下位置正確。每位孩子們都非常厲害&#xff0c;不僅完成了自己的一本&#xff0c;還將沒有…

C++數據結構與算法——二叉搜索樹的屬性

C第二階段——數據結構和算法&#xff0c;之前學過一點點數據結構&#xff0c;當時是基于Python來學習的&#xff0c;現在基于C查漏補缺&#xff0c;尤其是樹的部分。這一部分計劃一個月&#xff0c;主要利用代碼隨想錄來學習&#xff0c;刷題使用力扣網站&#xff0c;不定時更…

C++編程面試復盤:數組降重+快排+函數指針+類模板

面試真題 真題1 #include <iostream> // 在函數 find_repetnum 的參數列表中&#xff0c;int& length 中的 & 符號表示引用。通過將 length 聲明為引用&#xff0c;函數可以修改傳入的 length 變量的值&#xff0c;并且這種修改會在函數外部生效。 void find_r…

Vue2:路由history模式的項目部署后頁面刷新404問題處理

一、問題描述 我們把Vue項目的路由模式&#xff0c;設置成history 然后&#xff0c;build 并把dist中的代碼部署到nodeexpress服務中 訪問頁面后&#xff0c;刷新頁面報404問題 二、原因分析 server.js文件 會發現&#xff0c;文件中配置的路徑沒有Vue項目中對應的路徑 所以…

React withRouter的使用及源碼實現

一 基本介紹 作用&#xff1a; 把不是通過路由切換過來的組件中&#xff0c;將react-router 的 history、location、match 三個對象傳入props對象上。比如首頁&#xff01; 默認情況下必須是經過路由匹配渲染的組件才存在this.props&#xff0c;才擁有路由參數&#xff0c;才能…

嵌入式學習筆記Day27

今天主要學習了進程間的通信&#xff0c;主要學習了通過管道進行通信 一、進程間的通信 進程間的通信方式有以下幾種&#xff1a; 1.管道 2.信號 3.消息隊列 4.共享內存 5.信號燈 6.套接字二、管道 2.1無名管道 無名管道只能用于具有親緣關系的進程間通信 函數接口&#x…

Nacos進階

目錄 Nacos支持三種配置加載方案 Namespace方案 DataID方案 Group方案 同時加載多個配置集 Nacos支持三種配置加載方案 Nacos支持“Namespacegroupdata ID”的配置解決方案。 詳情見&#xff1a;Nacos config alibaba/spring-cloud-alibaba Wiki GitHub Namespace方案…

《TCP/IP詳解 卷一》第12章 TCP初步介紹

目錄 12.1 引言 12.1.1 ARQ和重傳 12.1.2 滑動窗口 12.1.3 變量窗口&#xff1a;流量控制和擁塞控制 12.1.4 設置重傳的超時值 12.2 TCP的引入 12.2.1 TCP服務模型 12.2.2 TCP可靠性 12.3 TCP頭部和封裝 12.4 總結 12.1 引言 關于TCP詳細內容&#xff0c;原書有5個章…

【C++ map和set】

文章目錄 map和set序列式容器和關聯式容器鍵值對setset的主要操作 mapmap主要操作 multiset和multimap map和set 序列式容器和關聯式容器 之前我們接觸的vector,list,deque等&#xff0c;這些容器統稱為序列式容器&#xff0c;其底層為線性序列的的數據結構&#xff0c;里面存…

【LV14 day4 字符設備驅動基礎框架】

一、字符設備驅動框架解析 設備的操作函數如果比喻是樁的話&#xff08;性質類似于設備操作函數的函數&#xff0c;在一些場合被稱為樁函數&#xff09;&#xff0c;則&#xff1a; 驅動實現設備操作函數 ----------- 做樁 insmod調用的init函數主要作用 --------- 釘樁 rm…

都說了能不動就別動,非要去調整,出生產事故了吧

MyBatis 替換成 MyBatis-Plus 背景介紹 一個老項目&#xff0c;數據庫用的是 MySQL 5.7.36 &#xff0c; ORM 框架用的 MyBatis 3.5.0 &#xff0c; mysql-connector-java 版本是 5.1.26 新來了一個干練的小伙&#xff0c;精力充沛&#xff0c;看著就是一個喜歡折騰的主 他…

leetcode 3.1

leetcode hot 100 雙指針1.三數之和2.接雨水 多維動態規劃1.最長公共子序列 雙指針 1.三數之和 三數之和 排序 雙指針的方法&#xff0c;固定一個數nums[i], 用兩數和找target - nums[i] 的數需要注意兩點: 1.需要去掉重復數字 while (l < r && nums[l] nums[…

社交APP開發能給用戶帶來什么

現在的社交軟件也非常的多&#xff0c;每款社交軟件都有自己的特色&#xff0c;社交軟件是日常中必備的軟件&#xff0c;不管是生活交流還是感情工作交流都是比較方便的&#xff0c;因為社交軟件滿足了日常的遠程交流問題&#xff0c;所以開發社交軟件也會逐漸的流行起來的。 …