圖論 之 最小生成樹

文章目錄

  • 題目
    • 1584.連接所有點的最小費用

  • 最小生成樹MST,有兩種算法進行求解,分別是Kruskal算法Prim算法
  • Kruskal算法從邊出發,適合用于稀疏圖
  • Prim算法從頂點出發,適合用于稠密圖:基本思想是從一個起始頂點開始,逐步擴展生成樹,每次選擇一條連接已選頂點和未選頂點的最小權重邊,直到所有頂點都被包含在生成樹中。

Prim算法的基本步驟:

  • 初始化:選擇一個起始頂點,將其加入生成樹中。
  • 選擇最小邊:在所有連接生成樹中頂點和未加入生成樹的頂點的邊中,選擇權重最小的邊。
  • 擴展生成樹:將這條邊及其連接的未加入頂點加入生成樹。
  • 重復:重復步驟2和步驟3,直到所有頂點都加入生成樹。

與求解最短路徑的Dijkstra算法的求解思路是有異曲同工之妙的

  • Prim 算法的樸素模版,時間復雜度 O ( n 2 ) O(n^2) O(n2)
# 該模版可以求解最小生成樹的權值ans = 0# done[i]表示節點i到最小生成樹的最小距離是否確定done = [False]*n # 注意,現在并沒有設置done[0]=Truedis = [float('inf')]*ndis[0] = 0# 構建最小生成樹for i in range(n):m = float('inf')# 還沒在樹中,并且到達樹的距離最小的節點for j in range(n):if not done[j] and (node < 0 or dis[j] < dis[node]):node = jdone[node] = True# 累加情況ans += dis[node]# 更新node的鄰居的情況for neigh in range(n):if not done[neigh] and edge[node][neigh] < dis[neigh]:dis[neigh] = edge[node][neigh]return ans
  • Kruakal算法是從邊出發,一直合并不與當前節點形成環的邊,時間復雜度 O ( e l o g e ) O(eloge) O(eloge),e是邊數
  • Kruskal算法模版
        # 先按照距離排序edge.sort(key=lambda x:x[0])# 使用并查集parent = list(range(n))def find(index):if parent[index] != index:parent[index] = find(parent[index])return parent[index]def union(index1,index2):parent[find(index1)] = find(index2)ans = 0count = 0 # 計數器# 對邊進行遍歷for d,x,y in edge:fx,fy = find(x),find(y)# 當屬于同一個祖先就不要,不然會形成環if fx == fy:continueans += d# 更新計數器count+=1union(x,y)# 如何合并了n-1的邊,就結束if count == n-1:breakreturn ans

題目

1584.連接所有點的最小費用

1584.連接所有點的最小費用

在這里插入圖片描述

思路分析:最小生成樹的模版題目

  • 使用Prim算法模版題
class Solution:def minCostConnectPoints(self, points: List[List[int]]) -> int:# 有兩種實現方式,分別是Kruskal算法和Prim 算法# Kruskal算法從邊出發,適合用于稀疏圖,prim算法從點出發,適合用于稠密圖n = len(points)# 先構建鄰接表edge = [[float('inf')]*n for _ in range(n)]for i in range(n):x1,y1 = points[i]for j in range(i+1,n):x2,y2 = points[j]d = abs(x1-x2)+abs(y1-y2)edge[i][j] = d edge[j][i] = d # 該模版可以求解最小生成樹的權值ans = 0# done[i]表示節點i到最小生成樹的最小距離是否確定done = [False]*n # 注意,現在并沒有設置done[0]=Truedis = [float('inf')]*ndis[0] = 0# 構建最小生成樹for i in range(n):m = float('inf')# 還沒在樹中,并且到達樹的距離最小的節點for j in range(n):if not done[j] and (node < 0 or dis[j] < dis[node]):node = jdone[node] = True# 累加情況ans += dis[node]# 更新node的鄰居的情況for neigh in range(n):if not done[neigh] and edge[node][neigh] < dis[neigh]:dis[neigh] = edge[node][neigh]return ans
  • 使用Kruskal算法模版
class Solution:def minCostConnectPoints(self, points: List[List[int]]) -> int:# 有兩種實現方式,分別是Kruskal算法和Prim 算法# Kruskal算法從邊出發,適合用于稀疏圖,prim算法從點出發,適合用于稠密圖# 使用Kruskal,從邊出發n = len(points)edge = []# 將全部的邊都加入這個edgefor i in range(n):x1,y1 = points[i]for j in range(i+1,n):x2,y2 = points[j]d = abs(x1-x2)+abs(y1-y2)edge.append((d,i,j))# 先按照距離排序edge.sort(key=lambda x:x[0])# 使用并查集parent = list(range(n))def find(index):if parent[index] != index:parent[index] = find(parent[index])return parent[index]def union(index1,index2):parent[find(index1)] = find(index2)ans = 0count = 0 # 計數器for d,x,y in edge:fx,fy = find(x),find(y)if fx == fy:continueans += dcount+=1union(x,y)if count == n-1:breakreturn ans

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

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

相關文章

前端面試之Box盒子布局:核心知識與實戰解析

目錄 引言&#xff1a;布局能力決定前端高度 一、盒模型基礎&#xff1a;看得見的像素戰爭 1. 標準盒模型 vs IE盒模型 2. 核心組成公式 3. 視覺格式化模型 二、傳統布局三劍客 1. 浮動布局&#xff08;Float Layout&#xff09; 2. 定位布局&#xff08;Position Layou…

OnlyOffice:前端編輯器與后端API實現高效辦公

OnlyOffice&#xff1a;前端編輯器與后端API實現高效辦公 一、OnlyOffice概述二、前端編輯器&#xff1a;高效、靈活且易用1. 完善的編輯功能2. 實時協作支持3. 自動保存與版本管理4. 高度自定義的界面 三、后端API&#xff1a;管理文檔、用戶與權限1. 輕松集成與定制2. 實時協…

Python多線程編程理解面試題解析

一、多線程介紹 Python 的多線程是一種實現并發編程的方式&#xff0c;允許程序同時執行多個任務。然而&#xff0c;由于 Python 的全局解釋器鎖&#xff08;GIL&#xff09;的存在&#xff0c;多線程在某些場景下可能無法充分利用多核 CPU 的性能。以下是對 Python 多線程的理…

如何通過 Python 實現一個消息隊列,為在線客服系統與海外運營的APP對接

對方有兩個核心需求: 訪客上線的時候,要通知對方的業務系統,業務系統根據訪客的身份信息,推送個性化的歡迎詞。訪客完成下單的時候,要能推送一個下單成功的通知,并且包含訂單信息和鏈接。根據這兩個需求,那就需要實現由客服系統到業務系統的消息隊列推送,以及通過 Open…

中文Build a Large Language Model (From Scratch) 免費獲取全文

中文pdf下載地址&#xff1a;https://pan.baidu.com/s/1aq2aBcWt9vYagT2-HuxdWA?pwdlshj 提取碼&#xff1a;lshj 原文、代碼、視頻項目地址&#xff1a;https://github.com/rasbt/LLMs-from-scratch 翻譯工具&#xff1a;沉浸式翻譯&#xff08;https://app.immersivetrans…

項目設置內網 IP 訪問實現方案

在我們平常的開發工作中&#xff0c;項目開發、測試完成后進行部署上線。比如電商網站、新聞網站、社交網站等&#xff0c;通常對訪問不會進行限制。但是像企業內部網站、內部管理系統等&#xff0c;這種系統一般都需要限制訪問&#xff0c;比如內網才能訪問等。那么一個網站應…

elf_loader:一個使用Rust編寫的ELF加載器

本文介紹一個使用Rust實現的ELF加載器。 下面是elf_loader的倉庫鏈接&#xff1a; github&#xff1a; https://github.com/weizhiao/elf_loaderhttps://github.com/weizhiao/elf_loader crates.io&#xff1a; https://crates.io/crates/elf_loaderhttps://crates.io/cra…

數據庫驅動免費下載(Oracle、Mysql、達夢、Postgresql)

數據庫驅動找起來好麻煩&#xff0c;我整理到了一起&#xff0c;需要的朋友免費下載&#xff1a;驅動下載 目前收錄了Oracle、Mysql、達夢、Postgresql的數據庫驅動的多個版本&#xff0c;后續可能會分享更多。

對接扣子雙向流式 TTS Demo

Web端對接Demo <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>TTS 測試</title> </head><body><h1>TTS 測試頁面</h1><textarea id"textInput" rows&…

科普:“git“與“github“

Git與GitHub的關系可以理解為&#xff1a;Git是一種軟件工具&#xff0c;而GitHub則是一個在線平臺&#xff0c;它們是“一家子”。二者的關聯最直接體現在你通過Git在GitHub倉庫中clone軟件包到你的機器中來。 具體來說&#xff1a; 一、Git 定義&#xff1a;Git是一個開源的…

jsherp importItemExcel接口存在SQL注入

一、漏洞簡介 很多人說管伊佳ERP&#xff08;原名&#xff1a;華夏ERP&#xff0c;英文名&#xff1a;jshERP&#xff09;是目前人氣領先的國產ERP系統雖然目前只有進銷存財務生產的功能&#xff0c;但后面將會推出ERP的全部功能&#xff0c;有興趣請幫點一下 二、漏洞影響 …

【目標檢測】【BiFPN】EfficientDet:Scalable and Efficient Object Detection

EfficientDet&#xff1a;可擴展且高效的目標檢測 0.論文摘要 模型效率在計算機視覺中變得越來越重要。在本文中&#xff0c;我們系統地研究了用于目標檢測的神經網絡架構設計選擇&#xff0c;并提出了幾項關鍵優化以提高效率。首先&#xff0c;我們提出了一種加權雙向特征金…

拖動線條改變區域大小

瀏覽網頁時&#xff0c;經常看到這樣一個功能&#xff0c;可以通過拖拽線條&#xff0c;改變左右區域大小 在管理后臺中更為常見&#xff0c;菜單的寬度如果固定死&#xff0c;而后續新增的菜單名稱又不固定&#xff0c;所以很可能導致換行&#xff0c;樣式不太美觀&#xff0c…

輸入框元素覆蓋沖突

后端響應中的 "trainingKbGroupName": "基礎死型" 通過searchForm2.initFormData(rowData[0]);操作會把基礎死型四個字填充到<div class"col-sm-5 form-group"> <label class"col-sm-3 control-label">知識點分組名稱<…

【LLM】Llama 3 論文精讀

導言 Llama 3.5系列模型的發布&#xff1a; Llama 3.5系列模型是開源的&#xff0c;最大模型參數為405B&#xff08;[[稠密Transformer架構]]&#xff0c;而不是MOE 架構&#xff09;&#xff0c;上下文窗口長度為128K。模型支持多語言和工具使用&#xff0c;并且在某些評估中已…

selenium環境搭建

1. 安裝selenium pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/如遇以下報錯 Getting requirements to build wheel ... errorerror: subprocess-exited-with-error Getting requirements to build wheel did not run successfully.│ exit code: 1╰─…

My first Android application

界面元素組成&#xff1a; 功能代碼&#xff1a; /*實現功能&#xff1a;當輸入內容后&#xff0c;歡迎文本發生相應改變&#xff0c;并清除掉文本域內容當未輸入任何內容時&#xff0c;彈出提示文本以警告用戶*/val greetingText findViewById<TextView>(R.id.printer)…

js版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]新特性

ES全稱ECMAScript,ECMAScript是ECMA制定的標準化腳本語言,本文講述Javascript[ECMAScript]版本ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]的新特性,幫助朋友們更好的熟悉和使用Javascript ES5 1.嚴格模式 use strict2.Object getPrototypeOf,返回一個對象的原…

Redis數據結構-String字符串

1.String字符串 字符串類型是Redis中最基礎的數據結構&#xff0c;關于數據結構與要特別注意的是&#xff1a;首先Redis中所有的鍵的類型都是字符串類型&#xff0c;而且其他集中數據結構也都是在字符串類似基礎上進行構建&#xff0c;例如列表和集合的元素類型是字符串類型&a…

cline通過硅基流動平臺接入DeepSeek-R1模型接入指南

為幫助您更高效、安全地通過硅基流動平臺接入DeepSeek-R1模型&#xff0c;以下為優化后的接入方案&#xff1a; DeepSeek-R1硅基流動平臺接入指南 &#x1f4cc; 核心優勢 成本低廉&#xff1a;注冊即送2000萬Tokens&#xff08;價值約14元&#xff09;高可用性&#xff1a;規…