2023年9月30日 週三 天氣晴 【不悲嘆過去,不荒廢現在,不懼怕未來】
參考文獻
實現了並查集,同時進行了兩點優化:
按樹的大小進行合併(也可按照樹的秩(高度)進行合併,兩種方法效率接近)
路徑壓縮(迭代法不夠極致,遞迴法壓縮的比較極致)
/**
* @license gnu general public license (gpl)
* @author march
* @email [email protected]
* @file main.cpp
* @brief 實現並查集(優化:1.按樹的大小進行合併;2.路徑壓縮)
* @version 1.0
* @date 2020-08-25
*/#include
"stdafx.h"
class
unionfind
// 遞迴版查詢根結點(極致的路徑壓縮)
intfind
(int x)
迭代版查詢根結點(不夠極致的路徑壓縮)
//int find(int x)
// return x;
//}// 按樹的大小進行合併
void
to_union
(int x1,
int x2)
else
// 連通數減1
--count_;
}// 判斷x1和x2是否連通
bool
connected
(int x1,
int x2)
// 返回連通分量個數
intcount()
};intmain()
#pragma once
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//#if !defined(afx_stdafx_h__d36e9d40_3bcb_4a85_9d48_ac876e7a2942__included_)
#define afx_stdafx_h__d36e9d40_3bcb_4a85_9d48_ac876e7a2942__included_
#if _msc_ver > 1000
#pragma once
#endif
// _msc_ver > 1000
#include
// 萬能的標頭檔案,可能需要手動加入include資料夾中
using
namespace std;
#endif
// !defined(afx_stdafx_h__d36e9d40_3bcb_4a85_9d48_ac876e7a2942__included_)
並查集 按秩合併 路徑壓縮
一種可以動態維護若干個不重疊的集合或無向圖的連通塊的資料結構。主要支援以下操作 find 查詢乙個元素屬於哪個集合 merge 合併兩個集合 並查集的每個集合都需要乙個 爹 來表示這整個集合,所以判斷兩個元素是否在同一集合,就看他們爹是否相同。有乙個顯而易見的初始化,對於要維護的序列,初始每個元素的...
並查集(路徑壓縮 按秩合併) 總結
就是連邊,然後,每次問你兩個點是否可互通。為無向邊 然後,暴力的話可能就是一條鏈下來,搞爆了。所以我們要想想優化。個人覺得這個比較好理解,很早便學會了,而且速度要優秀一些。就是將連了邊的同時指向乙個人 自擬的祖宗 然後,每次查詢的時候就壓縮一下路徑。具體是這樣來搞的 intgf int x intm...
並查集模板 (路徑壓縮 秩的合併)優化
void init int findroot int x return findroot pre x 否則一直往上找,找其最頂層的根結點 遞迴方式 int findroot int x return pre x findroot pre x 否則一直往上找,找其最頂層的根結點,並將路徑上的關聯點都加...