算法第五十五天:圖論part05(第十一章)

并查集理論基礎

并查集主要有兩個功能:

  • 將兩個元素添加到一個集合中。
  • 判斷兩個元素在不在同一個集合
    class UnionFind:def __init__(self, n):"""初始化并查集"""self.n = nself.father = list(range(n))  # 每個節點自己是根self.rank = [1] * n           # 每棵樹初始高度為1def find(self, u):"""查找根節點,同時做路徑壓縮"""if self.father[u] != u:self.father[u] = self.find(self.father[u])  # 路徑壓縮return self.father[u]def is_same(self, u, v):"""判斷 u 和 v 是否在同一個集合"""return self.find(u) == self.find(v)def join(self, u, v):"""按秩合并 u 和 v 所在集合"""u_root = self.find(u)v_root = self.find(v)if u_root == v_root:return  # 已經在同一個集合# 按秩合并:小樹掛到大樹下面if self.rank[u_root] < self.rank[v_root]:self.father[u_root] = v_rootelif self.rank[u_root] > self.rank[v_root]:self.father[v_root] = u_rootelse:self.father[u_root] = v_rootself.rank[v_root] += 1
    

    1.尋找存在的路徑

    主函數邏輯

    main 函數是程序的執行入口,它負責處理輸入、調用并查集的方法,并輸出結果。它的步驟是:

    • 讀取輸入:一次性讀取所有輸入數據,包括元素的總數 n、操作的次數 m,以及所有的合并和查詢數據。

    • 初始化并查集:創建一個 UnionFind(n) 的實例,準備好處理 n 個元素。

    • 執行合并操作:通過一個循環,讀取 m 對元素,并對每一對元素調用 uf.union() 方法,將它們所在的集合合并。

    • 執行查詢:讀取最后需要查詢的一對元素 sourcedestination

    • 輸出結果:調用 uf.is_same() 方法來判斷 sourcedestination 是否屬于同一個集合,然后根據結果輸出 10

    class UnionFind:

    ? ? #每個人的根都指向自己

    ? ? def __init__(self, size):

    ? ? ? ? self.parent = list(range(size+1))

    ? ? def find(self, u):

    ? ? ? ? if self.parent[u] != u:

    ? ? ? ? ? ? self.parent[u] = self.find(self.parent[u]) # 路徑壓縮

    ? ? ? ? return self.parent[u]

    ? ? def union(self, u, v):

    ? ? ? ? root_u = self.find(u)

    ? ? ? ? root_v = self.find(v)

    ? ? ? ? if root_u != root_v:

    ? ? ? ? ? ? self.parent[root_v] = root_u

    ? ? #檢查兩個元素 u 和 v 是否屬于同一個集合(也就是它們是否“連通”)

    ? ? def is_same(self, u, v):

    ? ? ? ? return self.find(u) == self.find(v)

    def main():

    ? ? #sys.stdin.read 這個方法有點不一樣。它是從標準輸入流中一次性讀取所有的輸入

    ? ? import sys

    ? ? input = sys.stdin.read

    ? ? data = input().split()

    ? ? index = 0

    ? ? n = int(data[index])

    ? ? index += 1

    ? ? m = int(data[index])

    ? ? uf = UnionFind(n)

    ? ? index += 1

    ? ? for _ in range(m):

    ? ? ? ? s = int(data[index])

    ? ? ? ? index += 1

    ? ? ? ? t = int(data[index])

    ? ? ? ? index += 1

    ? ? ? ? uf.union(s, t)

    ? ?

    ? ? source = int(data[index])

    ? ? index += 1

    ? ? destination = int(data[index])

    ? ? if uf.is_same(source, destination):

    ? ? ? ? print(1)

    ? ? else:

    ? ? ? ? print(-1)

    if __name__ == "__main__":

    ? ? main()

    今天就到這里了有點難!

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

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

    相關文章

    雨霧天氣漏檢率驟降80%!陌訊多模態車牌識別方案實戰解析

    一、行業痛點&#xff1a;車牌識別的天氣敏感性據《智慧交通系統檢測白皮書》統計&#xff0c;雨霧環境下傳統車牌識別漏檢率高達42.7%&#xff08;2024年數據&#xff09;。主要存在三大技術瓶頸&#xff1a;1.??水膜干擾??&#xff1a;擋風玻璃水漬導致車牌區域紋理模糊2…

    PostgreSQL15——查詢詳解

    PostgreSQL15查詢詳解一、簡單查詢1.1、單表查詢1.2、無表查詢1.3、消除重復結果1.4、使用注釋二、查詢條件2.1、WHERE子句2.2、模式匹配2.3、空值判斷2.4、復雜條件三、排序顯示3.1、單列排序3.2、多列排序3.3、空值排序四、限定結果數量4.1、Top-N查詢4.2、分頁查詢4.3、注意…

    03-容器數據卷

    卷就是目錄或文件&#xff0c;存在于一個或多個容器中&#xff0c;由 docker 掛載到容器&#xff0c;但不屬于聯合文件系統&#xff0c;因此能夠繞過 UnionFS&#xff0c;提供一些用于持續存儲或共享數據。 特性&#xff1a;卷設計的目的就是數據的持久化&#xff0c;完全獨立于…

    Linux內核進程管理子系統有什么第三十三回 —— 進程主結構詳解(29)

    接前一篇文章&#xff1a;Linux內核進程管理子系統有什么第三十二回 —— 進程主結構詳解&#xff08;28&#xff09; 本文內容參考&#xff1a; Linux內核進程管理專題報告_linux rseq-CSDN博客 《趣談Linux操作系統 核心原理篇&#xff1a;第三部分 進程管理》—— 劉超 《…

    從代碼學習深度強化學習 - 目標導向的強化學習-HER算法 PyTorch版

    文章目錄 1. 前言:當一個任務有多個目標 2. 目標導向的強化學習 (GoRL) 簡介 3. HER算法:化失敗為成功的智慧 4. 代碼實踐:用PyTorch實現HER+DDPG 4.1 自定義環境 (WorldEnv) 4.2 智能體與算法 (DDPG) 4.3 HER的核心:軌跡經驗回放 4.4 主流程與訓練 5. 訓練結果與分析 6. 總…

    前端 H5分片上傳 vue實現大文件

    用uniapp開發APP上傳視頻文件&#xff0c;大文件可以上傳成功&#xff0c;但是一旦打包為H5的代碼&#xff0c;就會一提示鏈接超時&#xff0c;我的代碼中是實現的上傳到阿里云 如果需要看全文的私信我 官方開發文檔地址 前端&#xff1a;使用分片上傳的方式上傳大文件_對象…

    Linux服務器Systemctl命令詳細使用指南

    目錄 1. 基本語法 2. 基礎命令速查表 3. 常用示例 3.1 部署新服務后&#xff0c;設置開機自啟并啟動 3.2 檢查系統中所有失敗的服務并嘗試修復 3.3 查看系統中所有開機自啟的服務 4. 總結 以下是 systemctl 使用指南&#xff0c;涵蓋服務管理、單元操作、運行級別控制、…

    【JVM內存結構系列】二、線程私有區域詳解:程序計數器、虛擬機棧、本地方法棧——搞懂棧溢出與線程隔離

    上一篇文章我們搭建了JVM內存結構的整體框架,知道程序計數器、虛擬機棧、本地方法棧屬于“線程私有區域”——每個線程啟動時會單獨分配內存,線程結束后內存直接釋放,無需GC參與。這三個區域看似“小眾”,卻是理解線程執行邏輯、排查棧溢出異常的關鍵,也是面試中高頻被問的…

    紅帽認證升級華為openEuler證書活動!

    如果您有紅帽證書&#xff0c;可以升級以下相應的證書&#xff1a;&#x1f447; 有RHCSA證書&#xff0c;可以99元升級openEuler HCIA 有RHCE證書&#xff0c;可以99元升級openEuler HCIP 有RHCA證書&#xff0c;可以2100元升級openEuler HCIE 現金激勵&#xff1a;&#x1f4…

    迭代器模式與幾個經典的C++實現

    迭代器模式詳解1. 定義與意圖迭代器模式&#xff08;Iterator Pattern&#xff09; 是一種行為設計模式&#xff0c;它提供一種方法順序訪問一個聚合對象中的各個元素&#xff0c;而又不暴露該對象的內部表示。主要意圖&#xff1a;為不同的聚合結構提供統一的遍歷接口。將遍歷…

    epoll 陷阱:隧道中的高級負擔

    上周提到了 tun/tap 轉發框架的數據通道結構和優化 tun/tap 轉發性能優化&#xff0c;涉及 RingBuffer&#xff0c;packetization 等核心話題。我也給出了一定的數據結構以及處理邏輯&#xff0c;但竟然沒有高尚的 epoll&#xff0c;本文說說它&#xff0c;因為它不適合。 epo…

    微前端架構常見框架

    1. iframe 這里指的是每個微應用獨立開發部署,通過 iframe 的方式將這些應用嵌入到父應用系統中,幾乎所有微前端的框架最開始都考慮過 iframe,但最后都放棄,或者使用部分功能,原因主要有: url 不同步。瀏覽器刷新 iframe url 狀態丟失、后退前進按鈕無法使用。 UI 不同…

    SQL Server更改日志模式:操作指南與最佳實踐!

    全文目錄&#xff1a;開篇語**前言****摘要****概述&#xff1a;SQL Server 的日志模式****日志模式的作用****三種日志模式**1. **簡單恢復模式&#xff08;Simple&#xff09;**2. **完整恢復模式&#xff08;Full&#xff09;**3. **大容量日志恢復模式&#xff08;Bulk-Log…

    git的工作使用中實際經驗

    老輸入煩人的密碼 每次我git pull的時候都要叫我輸入三次煩人的密碼&#xff0c;問了deepseek也沒有嘗試成功 出現 enter passphrase for key ‘~/.ssh/id_rsa’ 的原因: 在生成key的時候,沒有注意,不小心設置了密碼, 導致每次提交的時候都會提示要輸入密碼, 也就是上面的提示…

    科技賦能,寧夏農業繪就塞上新“豐”景

    在賀蘭山的巍峨身影下&#xff0c;在黃河水的溫柔滋養中&#xff0c;寧夏這片古老而神奇的土地&#xff0c;正借助農業科技的磅礴力量&#xff0c;實現從傳統農耕到智慧農業的華麗轉身&#xff0c;奏響一曲科技與自然和諧共生的壯麗樂章。一、數字農業&#xff1a;開啟智慧種植…

    imx6ull-驅動開發篇36——Linux 自帶的 LED 燈驅動實驗

    在之前的文章里&#xff0c;我們掌握了無設備樹和有設備樹這兩種 platform 驅動的開發方式。但實際上有現成的&#xff0c;Linux 內核的 LED 燈驅動采用 platform 框架&#xff0c;我們只需要按照要求在設備樹文件中添加相應的 LED 節點即可。本講內容&#xff0c;我們就來學習…

    深度學習中主流激活函數的數學原理與PyTorch實現綜述

    1. 定義與作用什么是激活函數&#xff1f;激活函數有什么用&#xff1f;答&#xff1a;激活函數&#xff08;Activation Function&#xff09;是一種添加到人工神經網絡中的函數&#xff0c;旨在幫助網絡學習數據中的復雜模式。類似于人類大腦中基于神經元的模型&#xff0c;激…

    Linux高效備份:rsync + inotify實時同步

    一、rsync 簡介 rsync&#xff08;Remote Sync&#xff09;是 Linux 系統下的數據鏡像備份工具&#xff0c;支持本地復制、遠程同步&#xff08;通過 SSH 或 rsync 協議&#xff09;&#xff0c;是一個快速、安全、高效的增量備份工具。二、rsync 特性 支持鏡像保存整個目錄樹和…

    一種通過模板輸出Docx的方法

    起因在2個群里都有網友討論這個問題&#xff0c;俺就寫了一個最簡單的例子。其實&#xff0c;我們經常遇到一些Docx的輸出的需求&#xff0c;“用模板文件進行處理”是最簡單的一個方法&#xff0c;如果想預覽也簡單 DevExpress 、Teleric 都可以&#xff0c;而且也支持 Web 、…

    探索 List 的奧秘:自己動手寫一個 STL List?

    &#x1f4d6;引言大家好&#xff01;今天我們要一起來揭開 C 中 list 容器的神秘面紗——不是直接用 STL&#xff0c;而是親手實現一個簡化版的 list&#xff01;&#x1f389;你是不是曾經好奇過&#xff1a;list 是怎么做到高效插入和刪除的&#xff1f;&#x1f50d;迭代器…