算法訓練營DAY55 第十一章:圖論part05

并查集理論基礎

背景

當我們需要判斷兩個元素是否在同一個集合里的時候,我們就要想到用并查集。

并查集主要有兩個功能:

  • 將兩個元素添加到一個集合中。
  • 判斷兩個元素在不在同一個集合

原理講解

?從代碼層面,我們如何將兩個元素添加到同一個集合中呢。

只需要用一個一維數組來表示,即:father[A] = B,father[B] = C 這樣就表述 A 與 B 與 C連通了(有向連通圖)。

// 將v,u 這條邊加入并查集
void join(int u, int v) {u = find(u); // 尋找u的根v = find(v); // 尋找v的根if (u == v) return; // 如果發現根相同,則說明在一個集合,不用兩個節點相連直接返回father[v] = u;
}

我們的目的是判斷這三個元素是否在同一個集合里,知道 A 連通 B 就已經足夠了。

這里要講到尋根思路,只要 A ,B,C 在同一個根下就是同一個集合。

給出A元素,就可以通過 father[A] = B,father[B] = C,找到根為 C。

給出B元素,就可以通過 father[B] = C,找到根也為為 C,說明 A 和 B 是在同一個集合里。

// 并查集里尋根的過程
int find(int u) {if (u == father[u]) return u; // 如果根就是自己,直接返回else return find(father[u]); // 如果根不是自己,就根據數組下標一層一層向下找
}

我們需要 father[C] = C,即C的根也為C,這樣就方便表示 A,B,C 都在同一個集合里了。

所以father數組初始化的時候要 father[i] = i,默認自己指向自己。

// 并查集初始化
void init() {for (int i = 0; i < n; ++i) {father[i] = i;}
}

最后我們如何判斷兩個元素是否在同一個集合里,如果通過 find函數 找到 兩個元素屬于同一個根的話,那么這兩個元素就是同一個集合,

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

?路徑壓縮

在實現 find 函數的過程中,我們知道,通過遞歸的方式,不斷獲取father數組下標對應的數值,最終找到這個集合的根。

如果這棵多叉樹高度很深的話,每次find函數 去尋找根的過程就要遞歸很多次。

我們的目的只需要知道這些節點在同一個根下就可以,所以對這棵多叉樹的構造只需要這樣就可以了,除了根節點其他所有節點都掛載根節點下,這樣我們在尋根的時候就很快,只需要一步,如果我們想達到這樣的效果,就需要?路徑壓縮,將非根節點的所有節點直接指向根節點。

我們只需要在遞歸的過程中,讓 father[u] 接住 遞歸函數 find(father[u]) 的返回結果。

因為 find 函數向上尋找根節點,father[u] 表述 u 的父節點,那么讓 father[u] 直接獲取 find函數 返回的根節點,這樣就讓節點 u 的父節點 變成根節點。

// 并查集里尋根的過程
int find(int u) {if (u == father[u]) return u;else return father[u] = find(father[u]); // 路徑壓縮
}

并查集主要有三個功能。

  1. 尋找根節點,函數:find(int u),也就是判斷這個節點的祖先節點是哪個
  2. 將兩個節點接入到同一個集合,函數:join(int u, int v),將兩個節點連在同一個根節點上
  3. 判斷兩個節點是否在同一個集合,函數:isSame(int u, int v),就是判斷兩個節點是不是同一個根節點

107. 尋找存在的路徑

107. 尋找存在的路徑

題目描述

給定一個包含 n 個節點的無向圖中,節點編號從 1 到 n (含 1 和 n )。

你的任務是判斷是否有一條從節點 source 出發到節點 destination 的路徑存在。

輸入描述

第一行包含兩個正整數 N 和 M,N 代表節點的個數,M 代表邊的個數。

后續 M 行,每行兩個正整數 s 和 t,代表從節點 s 與節點 t 之間有一條邊。

最后一行包含兩個正整數,代表起始節點 source 和目標節點 destination。

輸出描述

輸出一個整數,代表是否存在從節點 source 到節點 destination 的路徑。如果存在,輸出 1;否則,輸出 0。

輸入示例

5 4
1 2
1 3
2 4
3 4
1 4

輸出示例

1

#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int> father=vector<int>(101,0);
void init(){for(int i=1;i<=n;i++){father[i]=i;}
}
int find(int u){return u==father[u]?u: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)return;father[v]=u;
}int main(){int m,s,t,ss,d;cin>>n>>m;init();while(m--){cin>>s>>t;join(s,t);}cin>>ss>>d;if(isSame(ss,d))cout<<1<<endl;else cout<<0<<endl;
}

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

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

相關文章

docker相關操作記錄

1.docker清理服務器上面沒有用到的鏡像#刪除本地鏡像 docker rmi $(docker images -q) #強制刪除本地鏡像 docker rmi $(docker images -q) -f2.docker查看日志docker logs c36c56e4cfa3 (容器id)3.所有運行或沒有運行的鏡像 docker ps -a4、停止container&#xff0c;這樣才…

LInux基礎學習筆記七

/dev/zero和/dev/null 是什么/dev/zero&#xff1a;一個零設備文件&#xff0c;讀取時會不斷返回\0字節&#xff08;零值字節&#xff09;&#xff0c;常用于創建空文件或格式化/dev/null&#xff1a;一個空設備文件&#xff0c;寫入它的內容會被丟棄&#xff0c;相當于“黑洞”…

軟件架構:系統結構的頂層設計與戰略約束

軟件架構&#xff1a;系統結構的頂層設計與戰略約束軟件架構是軟件系統的“骨架”與“憲法”&#xff0c;它定義了系統的根本性組織結構&#xff0c;包括構成系統的關鍵構件、它們之間的組織關系、交互機制、約束原則以及指導性決策。它決定了系統在性能、可擴展性、可靠性、可…

基于spring boot的個人博客系統

2 開發技術 3 2.1 VUE框架 3 2.2 Mysql數據庫 3 2.3 Spring Boot框架 3 2.4 layui介紹 4 本程序在設計結構選擇上首選B/S&#xff0c;也是為了滿足程序今后升級便利&#xff0c;以及程序低維護成本的要求。本程序的網絡拓撲設計也會在下圖展示&#xff0c;通過圖形的方式來描述…

Excel制作尖刀圖,直觀展示業績漲跌

Excel制作尖刀圖&#xff0c;直觀展示業績漲跌效果展示下圖是一個常見的兩年業績同比表&#xff0c;也是尖刀圖很常見的數據源類型&#xff0c;但是這個數據格式是無法直接制作的&#xff0c;需要對數據進行加工。1.對數據進行逆透視使用excel進行逆透視&#xff0c;最常見的方…

兩種路由模式(React-Router 8)

倆種路由模式 各個主流框架的路由常用的路由模式有倆種&#xff0c;history模式和hash模式,ReactRouter分別由createBrowerRouter和createHashRouter函數負責創建附帶代碼:import Login from "../page/Login"; import Article from "../page/Article"; imp…

【01】OpenCV C++實戰篇——基于多項式插值的亞像素邊緣定位算法

文章目錄一. 背景二. 你的經歷三. 代碼實現(龜速版——單線程)3.1 梯度幅值3.1.1 生成 8 個方向模板3.1.2 計算梯度3.1.3 顯示梯度圖像3.1.4 程序運行演示3.2 梯度方向 &#xff08;梯度最大幅度值和方向&#xff09;3.3 單像素邊緣3.4 梯度單像素邊緣提取 運行測試四 、亞像素…

400V降24V,200mA,應用領域:從生活到工業的 “全能電源管家”WD5208

WD5208 電源芯片&#xff1a;小身材蘊藏大能量的電源控制新星在電源芯片的技術星河中&#xff0c;WD5208 憑借獨特性能與廣泛適用性嶄露頭角&#xff0c;成為眾多電子設備電源方案的優選。本文將全面解析這款芯片的核心優勢、應用場景與技術細節&#xff0c;展現其 “小身材&am…

C++ 引用 和 指針 的區別

特性引用指針初始化不能為 null&#xff0c;必須綁定到有效的對象可以為 null&#xff0c;不指向任何對象重新綁定不能重新綁定&#xff0c;一旦初始化后始終引用同一個對象可以重新指向其他對象內存占用不占用額外內存&#xff0c;編譯器通常將其優化為所引用的對象占用額外內…

Claude Code實戰體驗:AI智能編程助手如何重塑開發工作流?

一、背景介紹 AI大模型的爆發&#xff0c;讓各種智能編碼工具如雨后春筍般涌現。Claude Code就是其中非常有代表性的一款——它不僅能補全代碼、查找Bug&#xff0c;還能理解復雜需求&#xff0c;甚至幫你寫文檔、生成測試用例。作為一名全棧開發者&#xff0c;我和團隊最近幾個…

centos7 個人網站搭建之gitlab私有化部署實現線上發布

文章目錄 效果展示架構設計申請免費阿里云服務器嘗試連接遠程服務 開放端口申請域名 綁定云服務器組網網關服務器配置轉發代理網關服務器配置ssl 證書問題排查證書申請時報錯&#xff1a;Set the \server_name\ directive ti use the Nginx installer. gitlab私有化部署搭建git…

小米4A千兆版路由器刷機,解決Telnet無法連接問題

刷機極容易變磚&#xff0c;建議完全理清步驟后再進行操作 工具準備 1、小米4A千兆版路由器&#xff08;注意一定是千兆版&#xff0c;只是4A無千兆按下列步驟會變磚&#xff09;&#xff0c;適配電源線 2、網線一根 3、需保證刷機過程中網線接入是有網的&#xff0c;無需賬號認…

計算機網絡:如何將一個B類IP地址分為4個子網

要將一個B類IP地址劃分為4個子網&#xff0c;需通過子網掩碼擴展&#xff08;即借位&#xff09;來實現。以下是詳細步驟和原理&#xff1a; 一、B類IP地址的基礎特性 默認網絡位&#xff1a;B類地址前16位為網絡位&#xff08;標識網絡&#xff09;&#xff0c;后16位為主機位…

K8S 性能瓶頸排查

K8S 性能瓶頸排查 隨著業務量增長,Kubernetes 集群經常出現: ? Pod 啟動慢? ? API 響應慢? ? 節點 CPU 飆高? ? 服務無故中斷? 這可能是性能瓶頸在悄悄作祟。 性能瓶頸全局視角 # K8S 性能瓶頸排查思維導圖- 集群層面- API Server 響應慢- Etcd 壓力大- 控制面組件…

實習005 (web后端springboot)

五種創建方式一、方法一&#xff08;直接創建&#xff09;二、方法二&#xff08;阿里云&#xff09;三、方法三&#xff08;從官網&#xff09;或者說四、方法四、&#xff08;案例云官網&#xff09;五、方法五、&#xff08;自己寫&#xff09;先構建javaweb項目刷新后還是出…

基于vscode連接服務器實現遠程開發

目錄 一、背景介紹 1.1 什么是遠程開發 1.2 版本清單 二、以Java項目開發為例 2.1 安裝遠程開發插件 2.2 安裝語言開發插件 2.3 新建ssh連接 2.4 打開服務器目錄 一、背景介紹 1.1 什么是遠程開發 遠程開發是基于服務器環境進行實現本地開發操作&#xff0c;…

Java與Kotlin中“==“、“====“區別

一、Kotlin 中的區別&#xff08;雙等于&#xff09; - 結構相等性檢查比較兩個對象的內容是否相等&#xff08;相當于調用 equals() 方法&#xff09;。自動處理 null 安全&#xff1a;a b 等價于 a?.equals(b) ?: (b null)。示例&#xff1a;val s1 "Hello" v…

接口自動化測試框架-AIM

3天精通Postman接口測試&#xff0c;全套項目實戰教程&#xff01;&#xff01;最近在做公司項目的自動化接口測試&#xff0c;在現有幾個小框架的基礎上&#xff0c;反復研究和實踐&#xff0c;搭建了新的測試框架。利用業余時間&#xff0c;把框架總結了下來。 AIM框架介紹 …

Orange的運維學習日記--28.Linux邏輯卷詳解

Orange的運維學習日記–28.Linux邏輯卷詳解 文章目錄Orange的運維學習日記--28.Linux邏輯卷詳解為什么使用 LVM基本概念創建物理卷創建卷組創建邏輯卷創建文件系統并掛載清理 LVM 對象擴展與縮減邏輯卷擴展 LV縮減 LV調整文件系統大小擴展 XFS 文件系統擴展 EXT4 文件系統縮減 …

AI大模型學習三十三、HeyGem.ai 服務端(ubuntu)docker 安裝 /客戶端(win)分離部署

一、說明服務端安裝官方安裝客戶端在windows 上安裝解決分離問題利用samba實現共享&#xff0c;我是在局域網訪問&#xff0c;安裝道理可以在非局域網訪問重新弄了一塊顯卡&#xff0c;所以驅動也重新裝下二、環境準備(base) mucunax58:~$ lsb_release -a No LSB modules are …