并查集(競賽)

一、模型建立

本質就是一個數組,數組的下標對應節點的編號,數組的值對應對應編號的節點的父節點。規定根節點的父節點是自己。

規定三個集合的根節點分別是1 4 6

二、并查集操作并實現

并查集主要操作:查找一個節點的父節點,判斷兩個節點是不是在一個集合,合并兩個節點所在的兩個集合。

這里的第二第三個操作是基于第一個查找父節點的,但是查找父節點的操作有一個路徑優化,所以最后再講。

1、判斷兩個節點是不是在一個集合

看看兩個節點的父節點是不是相同就行了。

bool issame(int x, int y)
{return find(x) == find(y);
}

2、合并兩個節點所在的兩個集合

讓兩個節點的父節點合并,即一個父節點是另一個父節點的父節點。

void U(int x, int y)
{int root1 = find(x);int root2 = find(y);a[root1] = root2;
}

3、查找一個節點的父節點

根據數組特性,只要不是數值等于下標,那就不是父節點,還需要找數值的父節點,即找當前節點的父親的父親。

int find(int x)
{if (a[x] == x)return x;return find(a[x]);
}

但是如果一開始的結構是近似單支樹,那么每次查找的效率就會降低成O(N)

路徑壓縮:在遍歷到根節點之后,回溯時把回溯過程中經歷到的孩子節點的父節點全部修改成根節點,這樣就壓縮成了2層。

int find(int x)
{if (a[x] == x)return x;// 路徑壓縮:根的后代的父節點直接改成根return a[x] = find(a[x]);
}

三、例題

P3367 【模板】并查集 - 洛谷

#include "bits/stdc++.h"
using namespace std;
const int N = 2 * 1e5 + 10;
int a[N];
// 查找
int find(int x)
{if (a[x] == x)return x;// 路徑壓縮:根的后代的父節點直接改成根return a[x] = find(a[x]);
}
// 合并
void U(int x, int y)
{int root1 = find(x);int root2 = find(y);a[root1] = root2;
}// 判斷
bool issame(int x, int y)
{return find(x) == find(y);
}int main()
{int n, m;cin >> n >> m;// 1.初始化所有點是單獨一個集合,根是自己for (int i = 1; i <= n; i++)a[i] = i;while (m--){int op, x, y;cin >> op >> x >> y;if (op == 1)U(x, y);elseissame(x, y) == true ? cout << "Y" << endl : cout << "N" << endl;}return 0;
}

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

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

相關文章

Leetcode 刷題筆記1 圖論part04

leetcode 110 字符串接龍 def judge(s1, s2):count 0for i in range(len(s1)):if s1[i] ! s2[i]:count 1return count 1if __name__ __main__:n int(input())begin_str, end_str map(str, input().split())if begin_str end_str:print(0)exit()strlist []for _ in ran…

從擴展黎曼澤塔函數構造物質和時空的結構-7

有了先前關于電荷之間吸引和排斥關系的頻率分析圖&#xff0c;我們可以按照類似的方法&#xff0c;對磁場做一樣的分析&#xff0c;即分析磁體同極相斥&#xff0c;異極相吸的本質。 我們知道上圖得以成立的原因在于磁感線&#xff0c;如下圖所示的排布方式&#xff0c; 磁體的…

AI比人腦更強,因為被植入思維模型【18】萬物系統思維模型

把事物看成鏈&#xff0c;看成網&#xff0c;看成生態。 定義 萬物系統思維模型是一種將宇宙萬物視為一個相互關聯、相互作用的整體系統的思維方式。它強調從系統的角度去認識、分析和解決問題&#xff0c;認為系統中的各個要素之間存在著復雜的相互關系&#xff0c;這些關系不…

Qt-Q_ENUM宏和QMetaEnum類

Q_ENUM是一個宏定義&#xff0c;它的作用是將一個枚舉類型注冊到元對象系統&#xff0c;從而能夠通過QMetaEnum類獲得一些關于enum類型的一些信息&#xff0c;例如獲取enum類型的名稱字符串&#xff0c;enum值和字符串互相轉換&#xff0c;enum類型保存在QVariant中&#xff0c…

MongoDB 配合python使用的入門教程

MongoDB 入門教程 1. 安裝 MongoDB 首先&#xff0c;你需要在你的機器上安裝MongoDB。你可以從 MongoDB官網 下載并安裝 Community 版本。安裝完成后&#xff0c;啟動MongoDB服務。 # 在Linux/Mac上啟動MongoDB mongod# 在Windows上&#xff0c;你可以通過Windows服務啟動Mo…

【云馨AI-大模型】大模型的開發和應用中,Python、PyTorch和vLLM關系概括

說明 1. Python 定位&#xff1a;基礎編程語言。作用&#xff1a;Python 是大模型生態系統的核心語言&#xff0c;幾乎所有深度學習框架&#xff08;如 PyTorch、TensorFlow&#xff09;和工具鏈&#xff08;如 vLLM&#xff09;都通過 Python 接口提供服務。特點&#xff1a…

西門子200smart之modbus_TCP(做主站與第三方設備)通訊

西門子200smart做MODBUS_TCP主站通訊,只有一個指令。設置相關參數即可完成讀寫操作。整 個過程非常復雜,操作非常嚴謹。此次,我們使用匯川EASY系列PLC做從站,完成演示。關于匯川案例的演示,詳見匯川EASY系列之以太網通訊(MODBUS_TCP做從站)-CSDN博客 關于主站和從站的介…

緩存設計模式

緩存設計模式&#xff08;Cache Design Pattern&#xff09;是一種用于存儲和管理頻繁訪問數據的技術&#xff0c;旨在提高系統性能、降低數據庫或后端服務的負載&#xff0c;并減少數據訪問延遲。以下是幾種常見的緩存設計模式&#xff0c;并用 Python Redis 進行示例代碼實現…

Java算法隊列和棧經常用到的ArrayDeque

主要是記錄一下add&#xff0c;push&#xff0c;poll這三個常用api&#xff0c;因為這三個就是棧和隊列一念之差的關鍵 1.add(E e) 方法 ?作用&#xff1a;將元素添加到雙端隊列的尾部?&#xff08;等價于 addLast(E e)&#xff09;。?行為&#xff1a; ?成功時&#xff1…

機器學習——一元線性回歸(算法實現與評估)

一元線性回歸是統計學中最基礎的回歸分析方法&#xff0c;用于建立兩個變量之間的線性關系模型。 1. 模型表達式 一元線性回歸的數學模型為&#xff1a; &#xff1a;因變量&#xff08;預測值&#xff09;&#xff1a;自變量&#xff08;輸入變量&#xff09;&#xff1a;回…

Ubuntu下用QEMU模擬運行OpenBMC

1、前言 在調試過程中&#xff0c;安裝了很多依賴庫&#xff0c;具體沒有記錄。關于kvm&#xff0c;也沒理清具體有什么作用。本文僅記錄&#xff0c;用QEMU成功的將OpenBMC跑起來的過程&#xff0c;做備忘&#xff0c;也供大家參考。 2、環境信息 VMware Workstation 15 Pro…

Gradle/Maven 本地倉庫默認路徑遷移 (減少系統磁盤占用)

Gradle 配置環境變量 GRADLE_USER_HOME&#xff0c;如D:/.gradle同時將 %userprofile%/.gradle 移動到配置路徑 Maven 修改settings.xml文件&#xff0c;localRepository同時將 %userprofile%/.m2/repository 移動到配置路徑 IDEA默認用的bundle maven, 路徑為安裝目錄下 p…

MinGW與使用VScode寫C語言適配

壓縮包 通過網盤分享的文件&#xff1a;MinGW.zip 鏈接: https://pan.baidu.com/s/1QB-Zkuk2lCIZuVSHc-5T6A 提取碼: 2c2q 需要下載的插件 1.翻譯 找到VScode頁面&#xff0c;從上數第4個&#xff0c;點擊擴展&#xff08;以下通此&#xff09; 搜索---Chinese--點擊---安裝--o…

【C++初階】從零開始模擬實現vector(含迭代器失效詳細講解)

目錄 1、基本結構 1.1成員變量 1.2無參構造函數 1.3有參構造函數 preserve()的實現 代碼部分&#xff1a; push_back()的實現 代碼部分&#xff1a; 代碼部分&#xff1a; 1.4拷貝構造函數 代碼部分&#xff1a; 1.5支持{}初始化的構造函數 代碼部分&#xff1a; …

Java實習生面試題(2025.3.23 be)

一、v-if與v-show的區別 v-show 和 v-if 都是 Vue 中的條件渲染指令&#xff0c;它們的主要區別在于渲染策略&#xff1a;v-if 會根據條件決定是否編譯元素&#xff0c;而 v-show 則始終編譯元素&#xff0c;只是通過改變 CSS 的 display 屬性來控制顯示與隱藏。 二、mybatis-…

stm32標準庫開發需要的基本文件結構

使用STM32標準庫&#xff08;STM32 Standard Peripheral Library&#xff0c;SPL&#xff09;開發時&#xff0c;項目中必須包含一些必要的文件&#xff0c;這些文件確保項目能夠正常運行并與MCU硬件交互。以下詳細說明&#xff1a; 一、標準庫核心文件夾說明 使用標準庫開發S…

學生管理系統(需求文檔)

需求&#xff1a; 采取控制臺的方式去書寫學生管理系統 分析&#xff1a; 初始菜單&#xff1a; “----------歡迎來到java學生管理系統----------” “1:添加學生” “2&#xff1a;刪除學生” “3&#xff1a;修改學生” “4&#xff1a;查詢學生” “5&#xff1a;…

Java算法OJ(13)雙指針

目錄 1.前言 2.正文 2.1快樂數 2.2盛最多水的容器 2.3有效的三角形的個數 2.4和為s的兩個數 2.5三數之和 2.6四數之和 3.小結 1.前言 哈嘍大家好吖&#xff0c;今天繼續加練算法題目&#xff0c;一共六道雙指針&#xff0c;希望能對大家有所幫助&#xff0c;廢話不多…

SpringBoot分布式定時任務實戰:告別重復執行的煩惱

場景再現&#xff1a;你剛部署完基于SpringBoot的集群服務&#xff0c;凌晨3點突然收到監控告警——優惠券發放量超出預算兩倍&#xff01;檢查日志發現&#xff0c;兩個節點同時執行了定時任務。這種分布式環境下的定時任務難題&#xff0c;該如何徹底解決&#xff1f; 本文將…

MySQL 設置允許遠程連接完整指南:安全與效率并重

一、為什么需要遠程連接MySQL&#xff1f; 在分布式系統架構中&#xff0c;應用程序與數據庫往往部署在不同服務器。例如&#xff1a; Web服務器&#xff08;如NginxPHP&#xff09;需要連接獨立的MySQL數據庫數據分析師通過BI工具直連生產庫多服務器集群間的數據同步 但直接…