藍橋杯刷題記錄【并查集001】(2024)

主要內容:并查集

并查集

并查集的題目感覺大部分都是模板題,上板子!!

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]*n self.cnt = ndef find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return Falseself.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)

merge函數用于判斷x,y是否聯通,如果聯通return False。

lanqiao19719吊墜

# 并查集模板
class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]*n self.cnt = ndef find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return Falseself.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)n, m = map(int, input().split()) # 輸入處理strings = [] # 記錄字符串
for _ in range(n):strings.append(input())# 邊權為這兩個字符串的最長公共子串的長度,可以按環形旋轉改變起始位置,但不能翻轉
def f(s):m = len(s)# 兩個字符串拼接起來s_concat = s + s # 字典,鍵為子串長度,值為子串suffix_dict = {}for i in range(m):rotated = s_concat[i:i+m]for k in range(1, m):# 旋轉之后的子串suffix = rotated[-k:]if k not in suffix_dict:suffix_dict[k] = set()suffix_dict[k].add(suffix)return suffix_dict suffix_dicts = []
for s in strings:suffix_dicts.append(f(s))# 建圖,包括邊權,連接點
edges = []
for i in range(n):for j in range(i+1, n):max_ij_k = 0 for k in range(m, -1, -1):suffix_set_i = suffix_dicts[i].get(k, set())suffix_set_j = suffix_dicts[j].get(k, set())# 如果兩個集合相交不為空,記錄max_ij_k為k,因為是逆序的,所以直接記錄并breakif suffix_set_i & suffix_set_j:max_ij_k = k break weight = max_ij_kedges.append((weight, i, j))
# 邊權從小到大排序
edges.sort(reverse=True, key=lambda x : x[0])
uf = UnionFind(n)
# ans記錄值,cnt記錄次數
ans = 0 
cnt = 0
for weight, i, j in edges:if uf.merge(i, j):ans += weightcnt += 1# 臨界if cnt == n-1:break 
print(ans)

3493. 屬性圖

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]* n self.cnt = n def find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return False self.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)class Solution:def numberOfComponents(self, properties: List[List[int]], k: int) -> int:sets = list(map(set, properties))uf = UnionFind(len(properties))for i, a in enumerate(sets):for j, b in enumerate(sets[:i]):if len(a&b) >= k:uf.merge(i, j)return uf.cnt

思路:并查集,先利用集合的特性去重,根據properties的長度實例化并查集,雙重循環得到集合a和集合b,根據題目要求當?intersect(properties[i], properties[j]) >= k(其中?i?和?j?的范圍為?[0, n - 1]?且?i != j),節點?i?和節點?j?之間有一條邊,即當滿足條件時,將i,j連起來,并在merge函數中self.cnt -= 1。最終返回uf.cnt就行。

1971. 尋找圖中是否存在路徑

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]*n self.cnt = ndef find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return Falseself.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)class Solution:def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:uf = UnionFind(n)for i, j in edges:uf.merge(i, j)return uf.is_same(source, destination)

實例化一個并查集,遍歷edges中的i,j并連起來,遍歷結束就使用is_same()函數進行判斷是否連在一起。

200. 島嶼數量

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]*n self.cnt = ndef find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return Falseself.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)class Solution:def numIslands(self, grid: List[List[str]]) -> int:n = len(grid)m = len(grid[0])uf = UnionFind(m*n)ocean = 0for i in range(n):for j in range(m):if grid[i][j] == "0":ocean += 1else:# 向下查看if i < n-1 and grid[i+1][j] == "1":uf.merge(i*m+j, (i+1)*m+j)# 向右查看if j < m-1 and grid[i][j+1] == "1":uf.merge(i*m+j, i*m+j+1)return uf.cnt - ocean

思路:獲得grid的高n寬m,通過n*m實例化并查集,將grid中的每個元素當作一個點看,然后使用ocean記錄海水的熟練,當grid[i][j]==“1”時,向下向右查看,如果下面是1將當前位置i*m+j和(i+1)*m+j連起來,當右邊是1將當前位置和i*m+j+1連起來。最終返回uf.cnt-ocean即為所求答案。

1631. 最小體力消耗路徑

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]* n self.cnt = n def find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return False self.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)class Solution:def minimumEffortPath(self, heights: List[List[int]]) -> int:n = len(heights)m = len(heights[0])uf = UnionFind(n*m)edges = []dirs = (0, 1, 0)for i in range(n):for j in range(m):for a, b in pairwise(dirs):x = i + ay = j + b if 0 <= x < n and 0 <= y < m:edges.append((abs(heights[i][j] - heights[x][y]), i*m+j, x*m+y))edges.sort() # 求最小for h, i, j in edges:uf.merge(i, j)if uf.is_same(0, m*n-1):return h return 0

思路:和島嶼數量思路類似,通過n*m實例化并查集,edges記錄i,j和x,y之間的高度之差絕對值。根據這個值進行排序edges,然后開始遍歷edges,每次遍歷將i,j連起來,并判斷起點0和m*n-1是否連起來了,連起來了就直接return h因為edges是在此之前排過序的。

924. 盡量減少惡意軟件的傳播

class UnionFind:def __init__(self, n):self.pa = list(range(n))self.size = [1]* n self.cnt = n def find(self, x):if self.pa[x] != x:self.pa[x] = self.find(self.pa[x])return self.pa[x]def merge(self, x, y):fx = self.find(x)fy = self.find(y)if fx == fy:return False self.pa[fx] = fy self.size[fy] += self.size[fx]self.cnt -= 1return True def is_same(self, x, y):return self.find(x) == self.find(y)class Solution:def minMalwareSpread(self, graph: List[List[int]], initial: List[int]) -> int:n = len(graph)m = len(graph[0])uf = UnionFind(n)for i in range(n):for j in range(i + 1, n):graph[i][j] and uf.merge(i, j)cnt = Counter(uf.find(x) for x in initial)ans, mx = n, 0for x in initial:root = uf.find(x)if cnt[root] > 1:continuesz = uf.size[root]if sz > mx or (sz == mx and x < ans):ans = xmx = szreturn min(initial) if ans == n else ans

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

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

相關文章

海外SD-WAN專線網絡部署成本分析

作為支撐企業國際業務的重要基石&#xff0c;海外SD-WAN專線以其獨特的成本優勢和技術特性&#xff0c;正成為企業構建高效穩定的全球網絡架構的首選方案。本文將從多維度解構海外SD-WAN專線部署的核心成本要素&#xff0c;為企業的全球化網絡布局提供戰略參考。 一、基礎資源投…

操作系統(二):實時系統介紹與實例分析

目錄 一.概念 1.1 分類 1.2 主要指標 二.實現原理 三.主流實時系統對比 一.概念 實時系統&#xff08;Real-Time System, RTS&#xff09;是一類以時間確定性為核心目標的計算機系統&#xff0c;其設計需確保在嚴格的時間約束內完成任務響應。 1.1 分類 根據時間約束的嚴…

Golang的消息中間件選型

# Golang的消息中間件選型 消息中間件的作用 消息中間件是一種用于分布式系統中應用程序之間進行通信的基礎架構工具&#xff0c;它能夠有效地解耦發送者和接收者&#xff0c;并提供高可用性和可靠性的消息傳遞機制。在Golang應用程序中&#xff0c;選擇適合的消息中間件對于構…

大模型中的參數規模與顯卡匹配

在大模型訓練和推理中&#xff0c;顯卡&#xff08;GPU/TPU&#xff09;的選擇與模型參數量緊密相關&#xff0c;需綜合考慮顯存、計算能力和成本。以下是不同規模模型與硬件的匹配關系及優化策略&#xff1a; 一、參數規模與顯卡匹配參考表 模型參數量訓練階段推薦顯卡推理階…

帶頭結點 的單鏈表插入方法(頭插法與尾插法)

帶頭結點的單鏈表插入方法&#xff08;頭插法與尾插法&#xff09; 在單鏈表的操作中&#xff0c;插入是最常見的操作之一&#xff0c;本文介紹 帶頭結點的單鏈表 如何實現 后插法 和 前插法&#xff08;包括 插入法 和 后插數據交換法&#xff09;&#xff0c;并提供完整的 C …

Prometheus的工作流程

Prometheus 是一個開源的監控和告警系統&#xff0c;專為監控分布式系統而設計。它的工作流程主要包括以下幾個關鍵步驟&#xff1a; 1. 數據采集 (Scraping) 目標發現 (Service Discovery)&#xff1a; Prometheus 自動或手動配置監控目標&#xff0c;通過 DNS、Kubernetes、…

軟件工程面試題(二十二)

1、常用的設計模式有哪些&#xff1f;并寫出一段程序代碼 Factory(工廠模式)&#xff0c;Adapter(適配器模式)&#xff0c;Singleton(單例模式)&#xff0c;State(狀態模式)&#xff0c;Observer(觀察者模式) 等。 單例模式 public class Singleton{ private static Singleton …

【Pandas】pandas DataFrame select_dtypes

Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于獲取 DataFrame 的行索引DataFrame.columns用于獲取 DataFrame 的列標簽DataFrame.dtypes用于獲取 DataFrame 中每一列的數據類型DataFrame.info([verbose, buf, max_cols, …])用于提供 Dat…

如何利用ATECLOUD測試平臺的芯片測試解決方案實現4644芯片的測試?

作為多通道 DC-DC 電源管理芯片的代表產品&#xff0c;4644 憑借 95% 以上的轉換效率、1% 的輸出精度及多重保護機制&#xff0c;廣泛應用于航天航空&#xff08;衛星電源系統&#xff09;、醫療設備&#xff08;MRI 梯度功放&#xff09;、工業控制&#xff08;伺服驅動單元&a…

Python 編程實戰:打造高效便捷的目錄結構生成器

Python 編程實戰&#xff1a;打造高效便捷的目錄結構生成器 相關資源文件已經打包成EXE文件&#xff0c;可雙擊直接運行程序&#xff0c;且文章末尾已附上相關源碼&#xff0c;以供大家學習交流&#xff0c;博主主頁還有更多Python相關程序案例&#xff0c;秉著開源精神的想法&…

移動端六大語言速記:第6部分 - 錯誤處理與調試

移動端六大語言速記:第6部分 - 錯誤處理與調試 本文將對比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift這六種移動端開發語言在錯誤處理與調試方面的特性,幫助開發者理解和掌握各語言的異常處理機制。 6. 錯誤處理與調試 6.1 異常處理 各語言異常處理的語法對比:…

PyTorch優化器

PyTorch 提供了多種優化算法用于神經網絡的參數優化。以下是對 PyTorch 中主要優化器的全面介紹&#xff0c;包括它們的原理、使用方法和適用場景。 一、基本優化器 1. SGD (隨機梯度下降) torch.optim.SGD(params, lr0.01, momentum0, dampening0, weight_decay0, nesterov…

C++的UDP連接解析域名地址錯誤

背景 使用c開發一個udp連接功能的腳本&#xff0c;可以接收發送數據&#xff0c;而且地址是經過內網穿透到外網的 經過 通常發送數據給目標地址&#xff0c;需要把目的地址結構化&#xff0c;要么使用inet_addr解析ip地址&#xff0c;要么使用inet_pton sockaddr_in target…

Spark,上傳文件

上傳文件 1.上傳 先使用命令打開HDFS的NameNode [roothadoop100 hadoop-3.1.3]$ sbin/start-dfs.sh [roothadoop100 hadoop-3.1.3]$ sbin/stop-dfs.sh 和YARN的Job [roothadoop101 hadoop-3.1.3]$ sbin/start-yarn.sh [roothadoop101 hadoop-3.1.3]$ sbin/stop-yarn.sh 在Nam…

如何為Linux/Android Kernel 5.4和5.15添加 fuse passthrough透傳功能 ?

背景 參考&#xff1a;Google文檔 FUSE 透傳 參考此文檔&#xff0c;目前kernel.org提供的fuse passthrough補丁在6.9版本之后&#xff0c;但想要在5.4和5.15版本內核做移植應該如何簡單點呢&#xff1f;文檔中提到 Android的內核為5.4 和 5.15版本內核做了fuse passthrough功…

Ubuntu 防火墻配置

Ubuntu 的防火墻配置可以參考文章&#xff1a;Firewall - Ubuntu Server documentation 22 端口 需要注意的是&#xff0c;在啟動防火墻之前&#xff0c;需要先開放 22 端口。 否則 SSH 將會拒絕你連接防火墻。 開放 22 端口的命令為&#xff1a;sudo ufw allow 22 添加端…

Jetson 設備卸載 OpenCV 4.5.4 并編譯安裝 OpenCV 4.2.0

?一、卸載 OpenCV 4.5.4? 清除已安裝的 OpenCV 庫? sudo apt-get purge libopencv* python3-opencv # 卸載所有APT安裝的OpenCV包?:ml-citation{ref"1,3" data"citationList"}sudo apt autoremove # 清理殘留依賴?:ml-citation{ref"1,4"…

《AI大模型應知應會100篇》第57篇:LlamaIndex使用指南:構建高效知識庫

第57篇&#xff1a;LlamaIndex使用指南&#xff1a;構建高效知識庫 摘要 在大語言模型&#xff08;LLM&#xff09;驅動的智能應用中&#xff0c;如何高效地管理和利用海量知識數據是開發者面臨的核心挑戰之一。LlamaIndex&#xff08;原 GPT Index&#xff09; 是一個專為構建…

Sentinel[超詳細講解]-4

&#x1f693; 主要講解流控模式的 三種方式中的兩種&#xff1a; 直接、鏈路&#x1f680; 1?? 直接模式 &#x1f68e; 直接模式&#xff1a;對資源本身進行限流&#xff0c;例如對某個接口進行限流&#xff0c;當該接口的訪問頻率超過設定的閾值時&#xff0c;直接拒絕新的…

工作記錄 2017-03-24

工作記錄 2017-03-24 序號 工作 相關人員 1 修改了郵件上的問題。 更新RD服務器。 郝 更新的問題 1、修改了New User時 init的保存。 2、文件的查詢加了ID。 3、加了 patient insurance secondary 4、修改了payment detail的處理。 識別引擎監控 Ps (iCDA LOG :剔除…